算法训练营第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. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 10:50:03       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 10:50:03       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 10:50:03       45 阅读
  4. Python语言-面向对象

    2024-07-20 10:50:03       55 阅读

热门阅读

  1. MySQL分库与分表的设计思路

    2024-07-20 10:50:03       16 阅读
  2. AI、AGI、AIGC与AIGC、NLP、LLM,ChatGPT区分

    2024-07-20 10:50:03       18 阅读
  3. 高并发小结

    2024-07-20 10:50:03       17 阅读
  4. linux学习笔记整理: 关于linux:nginx服务器 2024/7/20;

    2024-07-20 10:50:03       17 阅读
  5. 初等数论精解【1】

    2024-07-20 10:50:03       17 阅读
  6. Base64编码与解码

    2024-07-20 10:50:03       23 阅读
  7. Android Studio关于Gradle及JDK问题解决

    2024-07-20 10:50:03       15 阅读
  8. Oracle(12)什么是主键(Primary Key)?

    2024-07-20 10:50:03       15 阅读
  9. 目标检测算法

    2024-07-20 10:50:03       15 阅读
  10. 使用python调用dll库

    2024-07-20 10:50:03       18 阅读