leetcode 494. 目标和

2023.8.14

leetcode 494. 目标和_第1张图片

        一杯茶,一包烟,一道dp做一天...

        ps:nums[i]均大于等于0。本题先转化为0-1背包问题:将数组元素分成两堆:一堆为正号,另一堆为负号。设正号堆的和为x,则负号堆的和为sum-x。(sum为数组元素总和)。               于是:x-(sum-x) =target ,可以推出 x = (target+sum)/2 。x必须为偶数,为奇数直接返回0。

        于是此时背包的大小相当于x,物品为数组nums。 dp[i]的含义为:装满大小为 i 的背包的 方法种数。  具体代码如下:

class Solution {
public:
    int findTargetSumWays(vector& nums, int target) {
        int sum = 0;
        for(int i=0; i dp(capacity + 1);
        dp[0] = 1;
        for(int i=0; i=nums[i]; j--)
            {
                //第一项是不使用nums[i]时装满背包的方法种数,第二项是使用nums[i]时装满背包的方法种数。
                dp[j] = dp[j] + dp[j - nums[i]];
            }
        }
        return dp[capacity];
    }
};

你可能感兴趣的:(leetcode专栏,leetcode,算法,职场和发展,c++,数据结构)