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

动态规划01背包之1049 最后一块石头的重量 II(第9道)

题目:

有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。

每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:

如果 x == y,那么两块石头都会被完全粉碎;
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x
最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0。

示例:

 

解法:

本题物品的重量为stones[i],物品的价值也为stones[i]。

对应着01背包里的物品重量weight[i]和 物品价值value[i]。

动规五部曲:

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

01背包中,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数组如何初始化:vector<int> dp(bagweight+1,0);

(4)确定遍历顺序:先遍历物品,后遍历背包容量

(5)举例推导dp数组

class Solution {
public:int lastStoneWeightII(vector<int>& stones) {//背包容量为所有石头重量/2;//转换成01背包问题:背包容量最多能装多少石头int n=stones.size();int sum=accumulate(stones.begin(),stones.end(),0);int bagweight=sum/2;vector<int> dp(bagweight+1,0);for(int i=0;i<n;i++){for(int j=bagweight;j>=stones[i];j--){dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);}}return sum-2*dp[bagweight];}
};

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

相关文章:

  • 运输层(TCP运输协议相关)
  • GDAL操作实践培训
  • 3.Redis主从复制、哨兵、集群
  • Windows电源模式(命令行)
  • 6月份读书学习好文记录
  • 【C语言】字符串函数
  • 【数据挖掘】时间序列教程【九】
  • 数据结构---特殊矩阵和广义表
  • mysql数据库的定时备份脚本(docker环境和非docker环境)
  • 【微信小程序】使用 wx.request 方法进行异步网络请求
  • MySQL 8 修改root密码ERROR 1064 (42000): You have an error in your SQL syntax;
  • SpringCloud——分布式请求链路跟踪Sleuth
  • 【2 beego学习 - 项目导入与项目知识点】
  • Langchain-ChatGLM配置文件参数测试
  • 测试QT读写锁(QReadWriteLock )和互斥锁(QReadWriteLock )的执行效率
  • 如何在 Windows 中免费合并 PDF 文件 [在线和离线]
  • 【LLM】金融大模型场景和大模型Lora微调实战
  • 途乐证券股市资讯-英伟达,又创历史新高!美股全线上涨
  • MySQL表聚合函数
  • JavaWeb 速通XML
  • redis浅析
  • 四种缓存的避坑总结
  • flutter开发实战-flutter二维码条形码扫一扫功能实现
  • 一篇文章了解Redis分布式锁
  • 记录第一次组装电脑遇到的坑
  • 右键pdf文件没有打印
  • 什么是CDN?CDN的原理和作用是什么?
  • 链路传播(Propagate)机制及使用场景
  • pytorch技巧总结1:学习率调整方法
  • 谈谈VPN是什么、类型、使用场景、工作原理