洛谷 P1025 [NOIP2001 提高组] 数的划分 (dfs)
https://www.luogu.com.cn/problem/P1025
给定一个n和k,把n拆分成k个数字的和,数字可以相同,但是种类不能相同。
求能凑出的数量。
输入7 3
输出4
明明是一道很简单的dfs,不知道为什么就是没有写好,还是看了别人的题解才过,我太菜了
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL N=500200,M=2002;
LL n,k,ans=0;
//前一个是啥,总数是啥,已经摆放好了的位置是多少?
void dfs(LL last,LL sum,LL num)
{
if(num==k)//刚好凑到k份
{
if(sum==n) ans++;//看一看有没有达标
return ;
}
for(LL i=last;sum+i*(k-num)<=n;i++)//当前位置是last,后面还有k-num个位置,要确保非递减,所以这样可以有效剪枝
dfs(i,sum+i,num+1);
}
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
//cin>>T;
while(T--)
{
cin>>n>>k;//将整数n分成k份
dfs(1,0,0);
//从1开始划分在第一份
//已经凑到的总数
//凑到了几个位置?
cout<<ans<<endl;
}
return 0;
}