一、题目回顾
将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:n=7,k=3,下⾯三种分法被认为是相同的:
1,1,5;
1,5,1;
5,1,1;
问有多少种不同的分法。
输⼊格式
n,k
输出格式
⼀个整数,即不同的分法
样例输⼊
7 3
样例输出
4
二、分析
使用递归来计算将整数 n 分成 k 份的方式。
我们首先找到规律,当 n 和 k 都给定时,我们可以考虑第一份的大小,它可以从 1 到 n/k 中选择,
第2份、第3份...都不能小于第一份的大小。
例如n=7,k=3,则n/k=2
则情况为:
1 1 5
1 2 4
1 3 3
2 2 3
若第一份在继续下去,则会出现重复。
一旦我们确定了第一份的大小,剩余的部分是将剩余的数字 (n - 第一份的大小) 分成 (k - 1) 份。
我们继续递归地对这些剩余的部分进行相同的过程,找结束条件:
若k=1,且n>0,那么这时只有1种情况;
若k=1,且n=0,则有0种情况(不够分);
若k=n,则也只有1种情况(例如n=7,k=7,则只能有一种情况,每一份都为1);
若n<k,则0种情况(不够分)。
。
代码如下:
int partition(int n, int k,int start) {
if (k == 1) {
return (n > 0) ? 1 : 0;
}
else if (n == k) {
return 1;
}
else if (n < k) {
return 0;
}
else {
int count = 0;
for (int i = start; i <= n /k; ++i) {
count += partition(n - i, k - 1,i);
//(剩余数字,可以分成k-1份,确保后面份数的数值大于等于前面)
}
return count;
}
}
int main() {
int n, k;
cin >> n >> k;
cout << partition(n, k,1) << endl;
return 0;
}