先使用简单的回溯算法解决问题
然后添加哈希表作为备忘录,解决回溯中的重叠子问题
最后通过推导得出状态转移,使用动态规划解决问题
题目:
给你输入一个非负整数数组 nums
和一个目标值 target
,现在你可以给每一个元素 nums[i]
添加正号 +
或负号 -
,请你计算有几种符号的组合能够使得 nums
中元素的和为 target
。
比如说输入 nums = [1,3,1,4,2], target = 5
,算法返回 3,因为有如下 3 种组合能够使得 target
等于 5:
-1+3+1+4-2=5
-1+3+1+4-2=5
+1-3+1+4+2=5
思路:
简单的回溯算法
递归遍历+num[i]以及-num[i]
class Solution { public: int findTargetSumWays(vector<int>& nums, int target) { if(nums.size()==0) return 0; result=0; backtrace(nums,0,target); return result; } void backtrace(vector<int>& nums,int n,int target){ // base case if(n==nums.size()){ if(target==0){ // 说明恰好凑出 target result++; } return; } // 给 nums[i] 选择 + 号 target-=nums[n]; // 穷举 nums[i + 1] backtrace(nums,n+1,target); // 撤销选择 target+=nums[n]; // 给 nums[i] 选择 - 号 target+=nums[n]; // 穷举 nums[i + 1] backtrace(nums,n+1,target); // 撤销选择 target-=nums[n]; } int result; };