【刷题笔记】--dp--01背包--494. 目标和

文章介绍了如何将一个寻找特定目标和的问题转化为01背包问题,通过动态规划的思路来解决。关键在于计算数组中正数之和,然后设定背包容量为(和+目标)的一半,并处理特殊情况。最后展示了一个具体的动态规划实现过程。
摘要由CSDN通过智能技术生成

题目:

思路: 

首先这道题要转化为01背包的模型是难点,

 

这样我们就可以把sumA求出来,sumA表示这个数组中附加号的数相加的值,相当于这道题就转化为已知每个物品的重量,背包只能放sumA的容量,要怎么放才能让背包容量刚刚好等于sumA。

按照01背包的正常思路:dp[i][j]表示前i个数装满背包总容量为j总共有多少方法。

有两种情况:

①j<nums[i-1]时,表示第i个数不能装进背包,背包容量还有j,则dp[i][j]=dp[i-1][j];

②其他情况下,dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i-1]];

初始化:如下

为什么j=0的那一列不能直接初始化,如果是dp[2][0],数组为[1,1,1,1,1],是不是有两种方法使target=0;-1+1 or +1-1 所以不能轻易直接初始化。

 

 代码:

int findTargetSumWays(int* nums, int numsSize, int target){
    int sum=0;
    int i,j;
    for(i=0;i<numsSize;i++){
        sum+=nums[i];
    }
    int bagSize=(sum+target)/2;//bagSize=4
    if(bagSize<0){
        bagSize=-bagSize;
    }
    if((sum+target)%2!=0||sum<target||sum<-target){
        return 0;
    }
    
    int dp[numsSize+1][bagSize+1];
    memset(dp,0,sizeof(dp));
    
    dp[0][0]=1;
    for(i=1;i<=numsSize;i++){
        for(j=0;j<=bagSize;j++){
            if(j>=nums[i-1]){
                dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i-1]];
            }
            else{
                dp[i][j]=dp[i-1][j];
            }
        }
    }
    return dp[numsSize][bagSize];

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值