Leetcode--494 目标和

题目:

给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。

返回可以使最终数组和为目标数 S 的所有添加符号的方法数。

示例 1:

输入: nums: [1, 1, 1, 1, 1], S: 3
输出: 5

思路:

这道题应该使用动态规划。

首先进行一些前处理。先求出数组nums的元素和,然后与目标值S相加,这样做相当于消除了负数,这样我们在查找元素时相当于只要找到那些使和为目标值target的元素即可。

这道题实际就是0-1背包问题的变种,所以解题思路与0-1背包问题一样。代码如下。

代码:

public static int findTargetSumWays(int[] nums, int S) {
        int sum=0;
        for(int i=0;isum) return 0;
        int target=(sum+S)/2;

        int[][] dp=new int[nums.length+1][target+1];
        for(int i=0;i<=nums.length;i++){
            dp[i][0]=1;
        }
        for(int i=nums.length;i>0;i--){
            for(int rem=0;rem<=target;rem++){
                if(rem-nums[i-1]<0) dp[i-1][rem]=dp[i][rem];
                else dp[i-1][rem]=dp[i][rem]+dp[i][rem-nums[i-1]];
            }
        }

        return dp[0][target];
    }

 

你可能感兴趣的:(Leetcode--494 目标和)