其他分享
首页 > 其他分享> > Leetcode 494. 目标和 dp

Leetcode 494. 目标和 dp

作者:互联网

地址 https://leetcode-cn.com/problems/target-sum/

给你一个整数数组 nums 和一个整数 target 。
向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 :
例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。
返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。


示例 1:
输入:nums = [1,1,1,1,1], target = 3
输出:5
解释:一共有 5 种方法让最终目标和为 3 。
-1 + 1 + 1 + 1 + 1 = 3
+1 - 1 + 1 + 1 + 1 = 3
+1 + 1 - 1 + 1 + 1 = 3
+1 + 1 + 1 - 1 + 1 = 3
+1 + 1 + 1 + 1 - 1 = 3

示例 2:
输入:nums = [1], target = 1
输出:1
 

提示:
1 <= nums.length <= 20
0 <= nums[i] <= 1000
0 <= sum(nums[i]) <= 1000
-1000 <= target <= 1000

解答
1 暴力遍历 每个元素可以有正负两个选择 2^20
2 dp 由于有负数不可作为索引。 将所有计算额外加上了1000。
3 dp 通过公式推导,变成了01背包。

方案2 代码

class Solution {
public:
	int findTargetSumWays(vector<int>& nums, int target) {
		int dp[22][2010]; memset(dp, 0, sizeof dp);
		dp[0][1000] = 1; target += 1000;
		for (int i = 1; i <= nums.size(); i++) {
			int val = nums[i - 1] ;
			
			for (int j = 2000; j >= 0; j--) {
				if (j - val >= 0) {
					dp[i][j] += dp[i - 1][j - val];
				}
				if (j + val <= 2000) {
					dp[i][j] += dp[i - 1][j + val];
				}
			}
		}

		return dp[nums.size()][target];
	}
};

我的视频题解空间

标签:target,val,nums,int,494,Leetcode,dp,1000
来源: https://www.cnblogs.com/itdef/p/16212636.html