力扣:494. 目标和

本文介绍了如何使用动态规划方法解决背包问题,通过将数组分为加法堆和减法堆,利用递推公式计算不同物品组合下凑齐背包容量的不同方法。代码详细展示了二维dp数组的初始化和递推过程。
摘要由CSDN通过智能技术生成

动态规划解题:

1.把数组中的全部值分成加法堆和减法堆, 加法堆- 减法堆 = target。加法堆+减法堆=sum。递推公式为加法堆等于(sum+targe)/2;

2.定义的dp数组表示的是0到i个物品中凑齐背包容量的不同中方法。

3.初始化二维数组的第0列和第0行后,来进行dp数组的递推。

class Solution {
    public int findTargetSumWays(int[] nums, int target) {
        int sum=0;
        int len=nums.length;
        for(int i:nums){
            sum+=i;
        }
//防止特殊的情况,例如背包容量不能分成正数,背包容量为负数时直接返回0
         if (sum<0 ||(sum+target)%2!=0 || (sum+target)<0){
            return 0;
        }
//定义一个二维数组表示0到i个物品中凑齐背包容量的不同方法有多少种
         int [][] dp=new int [len][((sum+target)/2)+1];
//初始化第o行的值
         for(int j=0;j<=(sum+target)/2;j++){
             if(nums[0]==j){
          dp[0][j]=1;
             }  
         }
//初始化第0列的值,因为数组中的值可能有0在,所以也能装入背包中
           int numZeros = 0;
        for(int i = 0; i < len; i++) {
            if(nums[i] == 0) {
                numZeros++;
            }
            dp[i][0] = (int) Math.pow(2, numZeros);

        }
//遍历dp数组,来进行递推,dp数组的推导公式为放物品i和不放物品i,两种装入背包方法
         for (int i=1;i<len;i++){
             for (int j=0;j<=(sum+target)/2;j++){
                 if (j>=nums[i]){
             dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i]];
                 }else{
               dp[i][j] = dp[i - 1][j];      
                 }
             }
         }
    return dp[len-1][(sum+target)/2];
    }
}

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值