494.目标和

494.目标和

给你一个非负整数数组 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

思路

题目的意思同前面题目,将一个数组分为两个数组。但题目要求寻找能够实现的方法的数量。

那么dp数组的定义就变成了当前背包容量下的几种方法。

递推公式变成dp[j]=dp[j]+dp[j-nums[i]],即在当前背包容量下,前面物品的装的方法加上必须包含当前物品的几种方法的和。

代码

    public int findTargetSumWays(int[] nums, int target) {
        int sum=Arrays.stream(nums).sum();
        int bagSize=(sum+target)/2;
        if ((target + sum) % 2 == 1 || Math.abs(target)>sum) return 0;
        int[] dp=new int[bagSize+1];
        dp[0]=1;
        for(int i=0;i<nums.length;i++){
            for (int j=bagSize;j>=nums[i];j--){
                dp[j]=dp[j]+dp[j-nums[i]];
            }
        }
        return dp[bagSize];
    }

你可能感兴趣的:(动态规划)