代码随想录算法训练营第四十四天

您所在的位置:网站首页 如何估一块石头的重量和体积大小 代码随想录算法训练营第四十四天

代码随想录算法训练营第四十四天

2024-07-07 09:35| 来源: 网络整理| 查看: 265

目录

1049.最后一块石头的重量

 思路

代码

494.目标和

思路

代码

 474.一和零

思路

代码

1049.最后一块石头的重量 本题就和 昨天的 416. 分割等和子集 很像了,可以尝试先自己思考做一做。

视频讲解:动态规划之背包问题,这个背包最多能装多少?LeetCode:1049.最后一块石头的重量II_哔哩哔哩_bilibili

代码随想录

 思路

        一开始我根本就看不懂,真的看着同班的学霸算法课考试框框写完,帅气提交离场都给我看傻了,分分钟就能写出来提交真的牛掰。这道题没思路说明你和我一样没有悟到他的本质:本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。

        这一下就明朗的啊,和昨天的分割等和子集不是一样吗,背包的容量就是总容量的一半。

        放上Carl哥的动态规划五部曲

1.确定dp数组以及下标的含义

        dp[j]表示容量(这里说容量更形象,其实就是重量)为j的背包,最多可以背最大重量为dp[j]。

        可以回忆一下01背包中,dp[j]的含义,容量为j的背包,最多可以装的价值为 dp[j]。

相对于 01背包,本题中,石头的重量是 stones[i],石头的价值也是 stones[i] ,可以 “最多可以装的价值为 dp[j]” == “最多可以背的重量为dp[j]”

2.确定递推公式

        01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

        本题则是:dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);

        一些同学可能看到这dp[j - stones[i]] + stones[i]中 又有- stones[i] 又有+stones[i],看着有点晕乎。大家可以再去看 dp[j]的含义。

3.dp数组如何初始化

        既然 dp[j]中的j表示容量,那么最大容量(重量)是多少呢,就是所有石头的重量和。

因为提示中给出1 = nums[i - 1]: dp[i][j] += dp[i - 1][j - nums[i - 1]] # 选取当前元素 return dp[len(nums)][target_sum] # 返回达到目标和的方案数  474.一和零 通过这道题目,大家先粗略了解, 01背包,完全背包,多重背包的区别,不过不用细扣,因为后面 对于 完全背包,多重背包 还有单独讲解。

视频讲解:动态规划之背包问题,装满这个背包最多用多少个物品?| LeetCode:474.一和零_哔哩哔哩_bilibili

代码随想录

思路

        大家学算法要坚持学,能坚持就要尽量坚持,我之前因为期末拉下了太多天没刷,结果今天要算法期末考试了想着算道练练手结果一点都不会写了。。。

        这道题是多重背包的类型题,之前蓝桥杯学的又忘了。。。(每日崩溃1/1)其实代码和01背包差不多,就是把内层遍历背包容量的顺序变成从前向后遍历,其他都差不多的。

代码 class Solution: def findMaxForm(self, strs: List[str], m: int, n: int) -> int: dp = [[0] * (n + 1) for _ in range(m + 1)] # 创建二维动态规划数组,初始化为0 for s in strs: # 遍历物品 zeroNum = s.count('0') # 统计0的个数 oneNum = len(s) - zeroNum # 统计1的个数 for i in range(m, zeroNum - 1, -1): # 遍历背包容量且从后向前遍历 for j in range(n, oneNum - 1, -1): dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1) # 状态转移方程 return dp[m][n]


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3