Description
将整数n分成k份,且每份不能为空,任意两种分法不能相同,问有多少种不同的分法。例如:n=7,k=3,可以分成:
1 1 5
1 2 4
1 3 3
2 2 3
共4种。
注意1 1 5,1 5 1,5 1 1 是相同的分法。
Input
输入有若干组,每组一行,有2个整数n,k.
Ouput
对应输出能分成的种数。
Sample Input
7 3
7 7
7 2
Sample Output
4
1
3
思路:
递推公式:f(n-1,k-1) + f(n-k,k)
假设n个物体分为m堆,有两种可能:
1、有一堆只有一个物体;
2、任何一堆都有至少两个物体
如果是第一种情景;有一堆只有一个物体就把这堆去掉,剩下的就是n - 1物体,放在m - 1堆里。于是就是递推公式第一项f(n-1,m-1);
如果是第二种情景;每一堆都至少有两个物体,那么就把每一堆去掉一个物体,剩下的就是n - m个物体,放在m 堆里。于是就是递推公式第二项f(n-m,m);
#include<iostream>
#include<string>
using namespace std;
int main(){
int n,k;
int fun(int n,int k);
while(cin>>n>>k){
cout<<fun(n,k)<<endl;
}
return 0;
}
int fun(int n,int k){
if(k == 1){
return 1;
}else if(k == n){
return 1;
}else if(n < k){
return 0;
}else{
return fun(n-1,k-1) + fun(n-k,k);
}
}