算法训练营第38天|1049. 最后一块石头的重量 II|494. 目标和|474.一和零

1049. 最后一块石头的重量 II

思路:本题思路为尽可能的将石头分成两堆。可以看成有一个容量为总和一半的背包,尽可能装满这个背包。

494. 目标和

思路:首先要把这道题转化为背包问题,这道题本质上是要将数组分成两个子集。其中一个子集满足一定的条件。

背包问题转化:假设加法的总和为x,那么减法对应的总和就是sum - x,所以我们要求的是

x - (sum - x) = target,所以x = (target + sum) / 2,此时问题就转化为,装满容量为x的背包,有几种方法。如果不能整除2,则没有方法。

dp[i][j]数组含义:nums数组前i个数字,和为j的组合数。

初始化:dp[0][0]=1,表示如果数组什么都没有的话,和为0只有一种方法,第一行其余初始化为0,表示如果数组什么都没有的话,和为其他值没有方法。只初始化第一行就行。

递推公式:情况分为选择第i个数值或者不选第i个数值。两种情况数相加。

dp[i][j]=dp[i-1][j];
if(j-nums[i-1]>=0) dp[i][j]+=dp[i-1][j-nums[i-1]];

错误点:1.初始化错误,使用上述的dp数组更容易初始化,即前i个的和

2.未考虑x<0的情况,这种情况也是要直接返回0的,因为一群非负数的和不可能是负数。

474.一和零

1.仍然是01背包,但是要在两个维度上做限制,可以使用二维滚动数组。

2.dp[i][j]表示在0的个数小于i,1的个数小于j的情况下,最多有这么多的字串。

3.这个题相当于每个物品的价值为1,其余与普通背包并无不同。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值