题目描述:给出一组候选数字(C)和目标数字(T),找到C中所有的组合,使找出的数字和为T。C中的数字可以无限制重复被选取。例如,给出候选数组[2,3,6,7]和目标数字7,所求的解为:[7],[2,2,3]
样例:给出候选数组[2,3,6,7]和目标数字7,返回 [[7],[2,2,3]]
跟问题“组合”(详见:点击打开链接)从本质上讲是一样的,都是“深搜” + “递归”的方法。只不过这个问题看上去要更难一些,因为允许有重复,且每一种数字组合的个数不一定相等。说的专业一点,我们应该把此类问题成为“回溯法”,和之前最大的区别,就是这里数字组合的问题需要用到“剪枝”的方法,所谓“剪枝”,其实就是当现在的情况已经不可能完成目标时,返回父节点(比如,这个问题中,当某一时刻的数字组合已经大于目标数字,我们就回溯,而不一定只是等于目标元素时,才回溯)。
不过我本人一向不喜欢把问题的方法归纳的太细,因为记不住嘛。所以我并不把这个问题和前面的组合分开,我依然认为他们是同一类问题。方法也是类似的,还是需要一个辅助函数helper