组合总和 Ⅳ的思路探讨与源码
组合总和 Ⅳ的题目如下图,该题属于数组类和动态规划类型的题目,主要考察对于动态规划方法的使用和数组结构的理解。本文的题目作者想到2种方法,分别是记忆化搜索方法和动态规划方法,其中动态规划方法使用Java进行编写,而记忆化搜索方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
本人认为该题目可以使用动态规划方法的思路进行解决,首先初始化一个动态规划数组,并把第一个元素赋值为1,然后开始遍历循环,对数组的每一个元素都进行判断,如果元素值小于等于动态规划的数组下标,那么就把动态规划当前的元素值和下标差值的元素值求和后赋予给当前动态规划数组的元素值,直到循环遍历结束,并返回动态规划的目标位的元素值,那么按照这个思路我们的Java代码如下:
#喷火龙与水箭龟
class Solution {
public int combinationSum4(int[] nums, int target) {
int[] arr = new int[target + 1];
arr[0] = 1;
for (int ir = 1; ir <= target; ir++) {
for (int numPer : nums) {
if (numPer <= ir) {
arr[ir] = arr[ir] + arr[ir - numPer];
}
}
}
return arr[target];
}
}
显然,我们的动态规划方法的效果还不错,还可以使用记忆化搜索的方法解决。首先判断目标值是否小于0,如果是则直接返回0的结果;如果目标值对应的数组值不等于-1就直接返回结果。然后开始遍历循环,将每个元素的值进行记忆化搜索并进行求和计算,直到遍历结束并返回结果。而主函数是初始化参数并进行记忆化搜索,直到搜索结束并返回最终结果。所以按照这个思路就可以解决,下面是Python代码:
#喷火龙与水箭龟
class Solution(object):
def combinationSum4(self, nums, target):
self.dp = [-1] * (target + 1)
self.dp[0] = 1
return self.dfsSearch(nums, target)
def dfsSearch(self, nums, target):
if(target < 0):
return 0
if(self.dp[target] != -1):
return self.dp[target]
resFinal = 0
for numPer in nums:
resFinal = resFinal + self.dfsSearch(nums, target - numPer)
self.dp[target] = resFinal
return resFinal
从结果来说Java版本动态规划方法的效率不错,而Python版本的记忆化搜索方法的速度比较一般,但应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。