Equal Sum Sets

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=49406

题意:

      输入n,k,s,求在不小于n的数中找出k个不同的数的和等于s的可能性有多少种。

样例:

    

Sample Input
9 3 23
9 3 22
10 3 28
16 10 107
20 8 102
20 10 105
20 10 155
3 4 3
4 2 11
0 0 0
Sample Output
1
2
0
20
1542
5448
1
0
0

  分析:

       用递推的方法把所有的值先求出来,保存到一个数组中,然后直接输出所求值即可。

公式:d[n][k][s]=d[n-1][k][s]+d[n-1][k-1][s-1]   s>=n时

   d[n][k][s]=d[n-1][k][s]    s<n时

 1 #include<iostream> 
 2 #include<cstring>  
 3 using namespace std;   
 4 int i,d[25][15][160],sum;  
 5 void db()  
 6 {  
 7     memset(d,0,sizeof(d));  
 8        //一些特殊值
 9     for( i=1;i<=20;i++)                  
10     {  
11         d[i][1][i]=1;  
12         d[i][0][0]=1;  
13     }  
14     for( i=2;i<=20;i++)  
15     {  
16         for(int k=1;k<=10;k++)  
17         {  
18             if(k>i)   break;     //不可能有集合满足
19             for(int s=1;s<=155;s++)  
20             {  
21                 sum=0;  
22                 sum=sum+d[i-1][k][s];  
23                 if(s>=i) sum=sum+d[i-1][k-1][s-i];  
24                 d[i][k][s]=sum;  
25                }  
26         }  
27     }  
28 return;
29 }  
30   int main()  
31 {  
32     db();  
33     int n,k,s; 
34     cin>>n>>k>>s;
35     while(n&&k&&s)  
36     { 
37         cout<<d[n][k][s]<<endl;
38         cin>>n>>k>>s;
39     }
40     return 0;  
41 }  

 

posted @ 2015-08-01 17:06  枫虹  阅读(118)  评论(0编辑  收藏  举报