算法题(104):数的划分
审题:
本题需要我们找出将值为n的数分为k个数的和的所有组合,并打印
时间复杂度分析:数据个数为三位数级别,所以我们需要严格剪枝才可以使用dfs算法
思路:方法一:深度优先算法
搜索与剪枝策略:
搜索策略:一格格的进行数据插入,利用pos定插入位置,begin定开始插入的数字
如图所示:
剪枝1:我们看到圆圈1的位置,若第一个插入了2,第二个就不能插入1了,因为21_会和前面的12_情况重合,此时我们就需要剪掉这种等效冗余情况
剪枝2:我们看到圆圈2的位置,当我们遍历到3开头时,根据剪枝1,我们只能往后面插入大于等于之前的数据的数字,而即使后面的数都是3也已经总和大于6了,所以以3开头是不可能满足条件,直接剪枝这种情况即可
剪枝3:我们如果dfs进入了不满足剪枝2的情况后才进行判断会导致有额外的时间消耗,可能导致超时,所以我们要在进入不满足剪枝2的情况之前进行剪枝。
解题:
(1)main函数
(2)dfs
剪枝1:本质上就是只能往位置中插入大于等于前一个位置的数据的数字,体现在代码中就是从begin值开始插入
剪枝2与3:首先确定剪枝2的实现,我们的当前sum加上剩下的空格中都为i的值的总和大与n,说明此时最小总和都大于n。剪掉该情况,直接返回上一层dfs。
其次确定剪枝位置,不能是for循环外面,因为在外面剪枝是属于进入了该情况才剪枝,而我们是要实现在进入剪枝情况之前就剪枝,所以要在进入dfs前进行判断
P1025 [NOIP 2001 提高组] 数的划分 - 洛谷