这个题整理的点在于方案的不重复
说实话,经验不足啊我,我刚开始是想找规律来着,但是没找到
我刚开始是在对1,1,5; 1,2,4 1,3,3 2,2,3这一串数观察,后来才发现,每组数据是非递减的,这一点很重要,我们就可以写一个函数了,void dfs(int last,int sum,int x) 思路就是,第x个划分要从上一个数据大小开始枚举,即开始从last枚举,每次递归结束之后,我们需要将上一个数据给下一次递归
另外就是剪枝操作,因为每组数据都是递增的,所以在枚举的时候,sum+i*(k-x)<=n就成了剪枝条件了,以为后面每个数最小是i,那如果他们都是i都比n大的话,是不是就没有必要再枚举了啊
题目来自 P1025 数的划分
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
#define MAXN
int n,k;
int result = 0;
void dfs(int last,int sum,int x)
{
if(x == k)//结束标志
{
if(sum == n) result++;
}
else
{
for(int i=last; sum+i*(k-x)<=n; i++)
{
dfs(i,sum+i,x+1);
}
}
}
int main()
{
cin>>n>>k;
dfs(1,0,0);
cout<<result<<endl;
return 0;
}