描述
将整数 n 分成 k 份,且每份不能为空,任意两个方案不相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。
1,1,5;
1,5,1;
5,1,1.
问有多少种不同的分法。
输入描述
n,k 。
输出描述
1 个整数,即不同的分法。
样例输入 1
7 3
样例输出 1
4
提示
数据范围与提示
6<n≤200,2≤k≤6
#include<bits/stdc++.h>
using namespace std;
int dp[210][10],k,n;
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
dp[i][1]=1;//任何数字分成1份只有一种方案
}
for(int i=2;i<=n;i++){
for(int j=2;j<=k;j++){
if(j>i){ //i分成j份, 无法分配
dp[i][j]=0;
}else{
dp[i][j]=dp[i-1][j-1]+dp[i-j][j];
}
}
}
cout<<dp[n][k];
return 0;
}
//
//数字n分成k份
//每份不为空 最小为1
//方案不相同 方案内部升序
//每一份的上限:
//7分成3份==第一份最小取1~最大取
//
//
// F1 <= F2 <= F3
//1~2
// 1 :6分成2份