Với ba số nguyên n
, k
và d
, có bao nhiêu cách thể n
được biểu diễn dưới dạng tổng của các số nguyên dương i<=k
, chẳng hạn rằng d
xảy ra ít nhất một lần trong tổng. Đó là bảo đảm rằng 0<d<=k
. Cách tiếp cận của tôi là một cách đệ quy;cách hiệu quả để tìm số tiền có thể
#include <stdio.h>
#include <stdlib.h>
int n,k,d,ans=0;
void solve(int totw,int flag)//totw is the total sum till now, and flag is to keep track of the number of d's in the sum.
{
if(totw>n)
return;
if(totw==n && flag>0)//flag>0--->at least 1 d
{
ans = (ans+1)%1000000007;//answer is expected modulo 10^9+7
return;
}
int i=1,h=k;
if(h>n-totw)
h=n-totw;
while(i<=h)
{
if(i==d)
flag++;
solve(totw+i,flag);
i++;
}
}
int main()
{
scanf("%d %d %d",&n,&k,&d);
solve(0,0);
printf("%d",ans);
}
Input:
Output:
Nhưng quan tòa cho thấy Time Limit Exceeded
. Có bất kỳ thuật toán hiệu quả hơn để tiến hành trong trường hợp này? 0<n,k<=100
PS: Tôi đã tự hỏi liệu có bất kỳ đối số tổ hợp nào có thể giải quyết câu hỏi này mà không cần recursion
hoặc iteration
. Và vâng .... thứ tự của các khoản tiềnvấn đề.
Ràng buộc cho n và k? – SergeyS
@SergeyS '0
yobro97
Không chắc chắn nếu tôi hiểu chính xác nhưng không phải là vấn đề giống như tính toán số cách (nd) có thể được biểu diễn như một tổng của i số nguyên trong đó i <= k -1? –