**2364 - 数的划分 ---深搜dfs剪枝
**来源:东方博宜oj oj.czos.cn
#include<bits/stdc++.h>
using namespace std;
/*
上下界剪枝:
1.每份的值>=前一份的值
2.每份的值<=剩余数的平均值
*/
int n,k;
int a[10];
int cnt=0;
// idx:讨论到了第idx个数可以填哪些值
void dfs(int idx)
{
if(n==0) return;
if(idx==k)
{
//最后一份的值>=前一份的值
if(n>=a[idx-1]) cnt++;
return;
}
//讨论第idx个数的上下界
for(int i=a[idx-1];i<=n/(k-idx+1);i++)
{
a[idx]=i;
n-=i; //计算剩余值的和
dfs(idx+1);
//下标为idx的位置准备填其他的值,恢复n的值
n+=i;
}
}
int main()
{
cin>>n>>k;
a[0]=1;//方便第1个数从1开始讨论
dfs(1); //从第一份值开始讨论
cout<<cnt;
return 0;
}
2364 - 数的划分 ---深搜dfs剪枝
最新推荐文章于 2024-07-24 14:54:00 发布