leetcode494——目标和——java实现

题目要求:
在这里插入图片描述
分析:
这道题可以转化为0 - 1背包来做。具体思路可参考:(https://leetcode-cn.com/problems/target-sum/solution/python-dfs-xiang-jie-by-jimmy00745/)总之。转化为0 - 1背包之后,就可以写出其递推方程。

具体代码如下:

class Solution {
    public int findTargetSumWays(int[] nums, int S) {
        int sum=0;
        for(int i=0;i<nums.length;i++){
            sum+=nums[i];
        }
        if((sum + S) % 2 != 0 || S > sum)
            return 0;
        int[][] dp=new int[nums.length+1][(sum + S) / 2+1];
        
        for(int i = 0; i <= nums.length; i ++) {
            dp[i][0]=1;
        }
        for(int i = nums.length; i > 0; i --) {
            for(int j=0; j <= (sum + S) / 2; j ++){
                if(j - nums[i - 1] < 0) {
                    dp[i - 1][j] = dp[i][j];
                } else {
                    dp[i-1][j]=dp[i][j]+dp[i][j-nums[i-1]];
                }
            }
        }
        return dp[0][(sum + S) / 2];
    }
}

我觉得对于动态规划的解法还是不是很清楚,这里可以用递归来做,虽然性能差,但是比较简单:

class Solution {
    int result = 0;
    public int findTargetSumWays(int[] nums, int S) {
        dfs(nums, S, 0);  //递归
        return result;
    }
    public void dfs(int[] nums, int S, int i){
        if(i >= nums.length) {
            if(S == 0)
                result ++;
            return;
        }
        dfs(nums, S - nums[i], i + 1);
        dfs(nums, S + nums[i], i + 1);
    }
}

把动态规划的思路给理了一遍,觉得差不多理清楚了,按照自己现在的思路重新写了一遍代码,确实就是一个0,1背包的问题,具体代码如下:

class Solution{
    public static int findTargetSumWays(int[] nums, int S) {
        int sum = 0;
        for(int i = 0; i < nums.length; i ++) {
            sum += nums[i];
        }
        if((sum + S) % 2 != 0 || S > sum)
            return 0;
        int target = (sum + S) / 2;
        
        int[][] dp = new int[nums.length + 1][target + 1];
        
        dp[0][0] = 1;
        for(int i = 1; i <= nums.length; i ++) {
            for(int j = 0; j <= target; j ++) {
                if(j < nums[i - 1]) {
                    dp[i][j] = dp[i - 1][j];
                } else {
                    dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i - 1]];
                }
            }
        }
        return dp[nums.length][target];
    }
}

这里要设置其初始值dp[0][0],不能忘记。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值