当前位置: 首页 > news >正文

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

题目来源:https://leetcode.cn/problems/last-stone-weight-ii/description/

 

 C++题解(思路来源代码随想录):本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了

动规五步曲:

  1. 确定dp数组以及下标的含义。dp[j]表示容量(这里说容量更形象,其实就是重量)为j的背包,最多可以背最大重量为dp[j]。本题中,石头的重量是 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]);
  3. dp数组如何初始化。既然 dp[j]中的j表示容量,那么最大容量(重量)就是所有石头的重量和。而我们要求的target其实只是最大重量的一半。
  4. 确定遍历顺序。如果使用一维dp数组,物品遍历的for循环放在外层,遍历背包的for循环放在内层,且内层for循环倒序遍历!
  5. 举例推导dp数组
// 自己的版本
class Solution {
public:int lastStoneWeightII(vector<int>& stones) {int len = stones.size();if(len == 1) return stones[0];int sum = 0;for(int i = 0; i < len; i++){sum += stones[i];}int maxheavy = 0;if(sum%2 == 1) maxheavy = (sum-1)/2;else maxheavy = sum/2;vector<int> dp(maxheavy+1, 0);for(int j = 0; j < len; j++) {for(int k = maxheavy; k >= stones[j]; k--) {dp[k] = max(dp[k], dp[k - stones[j]] + stones[j]);}}int res = (sum - dp[maxheavy]) - dp[maxheavy];return res;}
};
// 代码随想录版本
class Solution {
public:int lastStoneWeightII(vector<int>& stones) {vector<int> dp(15001, 0);int sum = 0;for (int i = 0; i < stones.size(); i++) sum += stones[i];int target = sum / 2;for (int i = 0; i < stones.size(); i++) { // 遍历物品for (int j = target; j >= stones[i]; j--) { // 遍历背包dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);}}return sum - dp[target] - dp[target];}
};

http://www.lryc.cn/news/109556.html

相关文章:

  • 【广州华锐视点】葡萄种植VR虚拟仿真实训平台
  • PBR材质理解整理
  • 从c++的角度来看ffmpeg 的架构
  • Ubuntu安装JDK与IntelliJ IDEA
  • 【雕爷学编程】Arduino动手做(182)---DRV8833双路电机驱动模块2
  • 一个完整的http请求响应过程
  • Unity通过代码切换材质
  • Java根据坐标经纬度计算两点距离(5种方法)、校验经纬度是否在圆/多边形区域内的算法推荐
  • PIC单片机如何设计延时
  • FFmpeg常见命令行(二):FFmpeg转封装
  • 全面升级:华为鸿蒙HarmonyOS4正式发布,玩趣个性化,小艺AI升级
  • 【python】使用Selenium和Chrome WebDriver来获取 【腾讯云 Cloud Studio 实战训练营】中的文章信息
  • 使用Feign 的远程调用,把mysql数据导入es
  • Java课题笔记~ MyBatis接口开发(代理开发)
  • 从数学到深度学习的学习资料及教程合集
  • nn.CrossEntropyLoss()报错
  • 【BASH】回顾与知识点梳理(一)
  • AWS Amplify 部署node版本18报错修复
  • K8S添加yum源并安装kubectl/kubeadm/kubelet组件
  • kafka生产者指定ip
  • python 封装sql 增删改查连接MySQL
  • Flink正常消费一段时间后,大量反压,看着像卡住了,但又没有报错。
  • 软件测试需求分析的常用方法
  • 数据结构10 -查找_树表查找
  • 第126天:内网安全-隧道技术SSHDNSICMPSMB上线通讯LinuxMac
  • 开发一个饲料商城小程序需要多少钱
  • Emacs之set-face-attribute与font-lock-add-keywords用法区别(一百二十八)
  • JavaScript高阶函数和闭包
  • 私有化部署企业IM即时通讯:提升效率、防止泄密、高效协同办公
  • react ant icon的简单使用