题意:给定n, k, s,求出含有k个元素,每个元素都不大于n且元素之和为s的集合的个数。
这里要注意集合里元素不能重复这个性质。
由于n,k,s都不大,直接递推出所有结果,递推的方法类似于背包问题。
dp[i][j][k]表示元素和为i,元素不超过j,个数为k的方案数。
具体递推式可参考代码。
#include<cstdio>
#include<cstring>
int n, k, s, ans;
int dp[156][21][11];
int main(){
memset(dp,0,sizeof(dp));
for(int i=1; i<=155; i++){
for(int j=1; j<=20; j++){
for(k=1; k<=10; k++){
if(k==1){
if(i<=j) dp[i][j][k] = 1;
}
else{
dp[i][j][k] = dp[i][j-1][k];
if(i>j) dp[i][j][k] += dp[i-j][j-1][k-1];
}
}
}
}
while(~scanf("%d %d %d", &n, &k, &s)){
if(!(n||k||s)) break;
printf("%d\n", dp[s][n][k]);
}
return 0;
}