将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。
1,1,5; 1,5,1; 5,1,1;
问有多少种不同的分法。
输入样例#1:
7 3
输出样例#1:
4
可以把这题看成 n 个数放进 k 个盒子里, 每个盒子里必须放数
于是有两种情况:
一、每个盒子要放的数都大于1
二、有至少1个盒子要放的数等于1
于是转移方程为
f[i][j] = f[i-j][j] + f[i-1][j-1]
代码如下
#include <cstdio>
int n, k;
int f[201][201];
int main(){
int i, j, t;
scanf("%d%d", &n, &k);
f[0][0] = 1;
for(i = 1; i <= n; i++){
for(j = 1; j <= k; j++){
if(i >= j) f[i][j] = f[i-j][j] + f[i-1][j-1];
}
}
//首先明确一点, 盒子不放 0 !!!
//f[i-j][j]每个盒子都大于一,先每个盒子各放1,剩 i-j,放j个盒子
//f[i-1][j-1],一个盒子只有1, 先在那个盒子放1, 剩i-1, 放j-1个盒子
printf("%d", f[n][k]);
return 0;
}