题目链接:
题意:
输入n,k,s,求在不小于n的数中找出k个不同的数的和等于s的可能性有多少种。
样例:
Sample Input
9 3 239 3 2210 3 2816 10 10720 8 10220 10 10520 10 1553 4 34 2 110 0 0Sample Output1202015425448100分析:
用递推的方法把所有的值先求出来,保存到一个数组中,然后直接输出所求值即可。
公式: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 #include2 #include 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< < >n>>k>>s;39 }40 return 0; 41 }