这个剪枝简直了,做了几次数据不强的类似的题,想都没想直接用之前的方法,疯狂超时,心态爆炸,还是看了别人代码,发现远不止我想的那么简单。
还是too young too simple
进入正题,这是一个要还原树枝的题目(题面)。我们可以理解为,把给出的所有数字序列 { S 1 , S 2 . . . S n } \{S_{1},S_{2}...S_{n}\} { S1,S2...Sn}中的数任意不重复地组合成若干个数,不限制组合成的数的个数,但要求它们都为同一个值 S U M SUM SUM,求满足要求的 S U M SUM SUM最小值。
这样没有规律的组合的情况,最方便的解法就是——DFS.
我们怎么去利用DFS,解决这个问题呢?
DFS要有明确的限制(退出条件),这道的题目的限制笼统的说就是——将所有数组合成若干个和相等的组合。但是组合的数量和组合的和的大小都未知,无法开始搜索。但是我们很显然地看出两者相关联——组合和的大小*组合数量=题目数字序列的和。最简单的就是限制组合和 S U M SUM SUM的大小,然后再去搜索。
那么就有一个思路了,遍历所有可能的组合的和( S U M SUM SUM),去搜索出一个合理的组合方式。至少存在的一个组合方式的最小的组合的和 S U M SUM