How do you add?(递推)
题意:求将n分为k个数相加的种数。
如:n=20,k=2,则可分为:
0+20=20
1+19=20
2+18=20
.......
20 +0=20
共21种方案。
解析:令f(n,m)表示将n分为m个数相加的种数,则 f(n,m)= ∑ f(n-i,m-1) (0 ≤ i ≤n)
代码如下:
1 # include<iostream> 2 # include<cstdio> 3 # include<set> 4 # include<cstring> 5 # include<algorithm> 6 using namespace std; 7 const int mod=1000000; 8 int a[105][105];///a[i][j]表示把i分为j个数的方法个数; 9 int main() 10 { 11 int i,j,l,n,k; 12 memset(a,0,sizeof(a)); 13 for(i=0;i<=100;++i) 14 a[i][1]=a[0][i]=1; 15 for(i=1;i<=100;++i){ 16 for(k=2;k<=100;++k){ 17 for(l=0;l<=i;++l){ 18 a[i][k]+=a[i-l][k-1]; 19 a[i][k]%=mod; 20 } 21 } 22 } 23 while(scanf("%d%d",&n,&k),n+k) 24 { 25 printf("%d\n",a[n][k]); 26 } 27 return 0; 28 }
这道题和 UVA-12304 Race 如出一辙