Problem: 494. 目标和
思路
根据题意特征,尝试将等式归纳为x-y=target
,x+y=sum
,则可以将x用y表示(或者y用x表示),x=(sum+target)/2
,y=(sum-target)/2
; 用x表示,则可以认为装满x有几种方式 -> 组合问题
;
dp数组下标的含义装满j容量的背包,有多少种方法;
递推公式(求组合)dp[j] += dp[j-nums[i]];
不放当前i有dp[j-nums[i]]
种方法,那么相应放当前i就有dp[j-nums[i]]
种方法;
dp初始化:要保证dp[0]=1
(即装满容量为0的背包,有1种⽅法), 否则递推公式无效.
Code
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int target) {
int sum = 0;
for(int i = 0; i < nums.size(); ++i)
sum += nums[i];
if(target > sum) return 0;
if( (sum-target) % 2 == 1) return 0;
int bagWeight = (sum-target)/2;
vector<int> dp(bagWeight+1, 0);
dp[0] = 1;
for(int i = 0; i < nums.size(); ++i)
{
for(int j = bagWeight; j >= nums[i]; --j)
{
dp[j] += dp[j-nums[i]];
}
}
return dp[bagWeight];
}
};