题目传送门:P1025 [NOIP2001 提高组] 数的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目描述
将整数 nn 分成 kk 份,且每份不能为空,任意两个方案不相同(不考虑顺序)。
例如:n=7n=7,k=3k=3,下面三种分法被认为是相同的。
1,1,51,1,5;
1,5,11,5,1;
5,1,15,1,1.
问有多少种不同的分法。
输入格式
n,kn,k (6<n≤2006<n≤200,2≤k≤62≤k≤6)
输出格式
11 个整数,即不同的分法。
输入输出样例
输入 #1
7 3
输出 #1
4
说明/提示
四种分法为:
1,1,51,1,5;
1,2,41,2,4;
1,3,31,3,3;
2,2,32,2,3.
【题目来源】
NOIP 2001 提高组第二题
#dfs 虽然dfs没有dp快,但是这道题数据很小,对于和我一样的蒟蒻来说,如果在比赛中dp和dfs同样能过那最好还是用dfs,因为dfs的思路简单不容易错而且代码好写方便改错。这里因为要考虑到不重复,所以可以按升序记录每一次划分:记录上一次划分所用的数,保证当前划分所用数不小于上次划分所用分数,当划分次数等于k时比较该次划分所得总分是否与n相同并记录次数。
有一个不得不做的剪枝就是枚举当前划分所用分数时应该从last(上次划分所用分数)枚举到sum+i*(k-cur)<=n为止,因为之后划分的分数一定大于或等于当前划分所用分数。这个剪枝不做的话不仅会TLE,在TLE之间就爆栈RE了(洛谷测评机没有无限栈,差评)
代码:
#inclu