将整数 nn 分成 kk 份,且每份不能为空,任意两个方案不相同(不考虑顺序)例如:n=7n=7,k=3k=3,下面三种分法被认为是相同的。
1,1,5 1,1,5 1,5,1 1,5,1 5,1,1 5,1,1
问有多少种不同的分法。
输入格式
第一行有两个整数 n,kn,k (6 <n \le 200,2 \le k \le 6)(6<n≤200,2≤k≤6)
输出格式
11 个整数,即不同的分法个数。
Sample Input
7 3
Sample Output
4
code
将整数 nn 分成 kk 份,且每份不能为空,任意两个方案不相同(不考虑顺序)例如:n=7n=7,k=3k=3,下面三种分法被认为是相同的。
1,1,51,1,5 1,5,11,5,1 5,1,15,1,1
问有多少种不同的分法。
输入格式
第一行有两个整数 n,kn,k (6 <n \le 200,2 \le k \le 6)(6<n≤200,2≤k≤6)
输出格式
11 个整数,即不同的分法个数。
Sample Input
7 3
Sample Output
4
将整数 nn 分成 kk 份,且每份不能为空,任意两个方案不相同(不考虑顺序)例如:n=7n=7,k=3k=3,下面三种分法被认为是相同的。
1,1,51,1,5 1,5,11,5,1 5,1,15,1,1
问有多少种不同的分法。
输入格式
第一行有两个整数 n,kn,k (6 <n \le 200,2 \le k \le 6)(6<n≤200,2≤k≤6)
输出格式
11 个整数,即不同的分法个数。
Sample Input
7 3
Sample Output
4
dfs即可求出答案,这个时间复杂度比较高,但是比较好理解。
我们只让后面的数比前面的大,这样就不用考虑顺序问题了
例如7划分
1 1 5
1 2 4
1 3 3
2 2 3
正好是四个
本题灵感来源于自然数拆分
code
#include <iostream>
#include <queue>
using namespace std;
int cnt;
int n,k;
void DFS2(int si,int sum,int step)
{
if(step==k) //基线
{
if(sum==n)
cnt++;
else
return;
}
else
{
for(int j=si;j<=(n-sum+1)/(k-step);j++) //优化循环,不然超时
{
if(sum+j<=n&&si<=j)
{
DFS2(j,sum+j,step+1);
}
}
}
return;
}
int main()
{
cin >>n >>k;
DFS2(1,0,0); //第一个数从一开始搜索
cout <<cnt;
return 0;
}