【数据结构与算法】【动态规划】 目标和

- [ ] List item
**思路:**可以转换以下思路

  • 先求出数组的总和 sum
  • 然后选定几个数的和为neq,得到关系 neq+target = sum-neq
  • 所以neq = (sum-target)/2;

题目就可以转为中数组中选择几个数,和为neq;

使用动态规划来解决这个问题:
dp[i][j]表示从前i个数里面选择后得到总和为j的个数。

代码

class Solution {
    //可以使用0-1背包问题解决
    public int findTargetSumWays(int[] nums, int target) {
        int sum = 0;
        for (int num : nums) {
            sum += num;
        }
        if(sum<target || (sum-target)%2!=0) return 0;
        int neq = (sum - target) / 2;
        //dp[i][j]表示从前i中选取的和为j的 方案数
        int[][] dp = new int[nums.length + 1][neq + 1];
        dp[0][0] = 1;
        for(int i=1;i<dp.length;i++){
            for(int j=0;j<dp[0].length;j++){
            	//从上一步得到的结果
                dp[i][j]+= dp[i-1][j];
                //j-nums[i-1] >=0 ,满足状态,更新dp[i][j]
                if(j-nums[i-1]>=0){
                    dp[i][j]+=dp[i-1][j-nums[i-1]];
                }
            }
        }
        return dp[dp.length-1][neq];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值