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 如出一辙

 或是http://www.cnblogs.com/20143605--pcx/p/4677157.html

posted @ 2015-07-26 09:26  20143605  阅读(223)  评论(0编辑  收藏  举报