标签:
题目链接: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 }
标签:
原文地址:http://www.cnblogs.com/fenhong/p/4694336.html