Luogu P1025 数的划分
Luogu P1025 数的划分
因为这里要考虑到不重复,所以可以按升序记录每一次划分:记录上一次划分所用数,保证当前划分所用数不小于上次划分所用数,当划分次数等于$k$时,比较该次划分所得总分是否与$n$相同并记录次数。
这题标签里的剪枝就是枚举当前划分所用分数时应该从$last$(上次划分所用分数)枚举到$sum+i \times (k-cur)\leq n$为止,因为之后划分的分数一定大于或等于当前划分所用分数。
#include<bits/stdc++.h>
using namespace std;
int n,k,ans;
void DFS(int sum,int lst,int num) {
if(num==k) {
if(sum==n) {
ans++;
}
return;
}
for(int i=lst;sum+i*(k-num)<=n;i++) {
DFS(sum+i,i,num+1);
}
return;
}
int main()
{
scanf("%d%d",&n,&k);
DFS(0,1,0);
printf("%d",ans);
return 0;
}