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;
}
posted @ 2019-08-29 21:43  WalkerV  阅读(130)  评论(0编辑  收藏  举报