LeetCode-动态规划背包题-1049. 最后一块石头的重量 II
描述
1049. 最后一块石头的重量 II
有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。
每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:
如果 x == y,那么两块石头都会被完全粉碎;
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0。
示例 1:
输入:stones = [2,7,4,1,8,1]
输出:1
解释:
组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],
组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],
组合 2 和 1,得到 1,所以数组转化为 [1,1,1],
组合 1 和 1,得到 0,所以数组转化为 [1],这就是最优值。
示例 2:
输入:stones = [31,26,33,21,40]
输出:5
示例 3:
输入:stones = [1,2]
输出:1
提示:
1 <= stones.length <= 30
1 <= stones[i] <= 100
思路一:动态规划
最后一块石头的重量:从一堆石头中,每次拿两块重量分别为x,y的石头,若x=y,则两块石头均粉碎;若x<y,两块石头变为一块重量为y-x的石头求最后剩下石头的最小重量(若没有剩下返回0)
问题转化为:把一堆石头分成两堆,求两堆石头重量差最小值
进一步分析:要让差值小,两堆石头的重量都要接近sum/2;我们假设两堆分别为A,B,A<sum/2,B>sum/2,若A更接近sum/2,B也相应更接近sum/2
进一步转化:将一堆stone放进最大容量为sum/2的背包,求放进去的石头的最大重量MaxWeight,最终答案即为sum-2*MaxWeight;、
0/1背包最值问题:外循环stones,内循环target=sum/2倒序,应用转移方程1
class Solution {public:int lastStoneWeightII(vector<int>& stones) {//转化为01背包问题,就是分两组,看那一组离容量sum/2最近int n = stones.size(); //获取 int sum = 0;for(int i=0;i<stones.size();i++) sum+=stones[i]; //求数组中总重量int targert = sum/2;vector<int> dp(targert+1); //定义dp[i],返回容量为j时候装石头最大重量//开始01背包for(int i=0;i<n;i++){for(int j=targert;j>=stones[i];j--){dp[j] = max(dp[j],dp[j-stones[i]]+stones[i]);}}return sum-dp[targert] - dp[targert];}
};
LeetCode-动态规划背包题-1049. 最后一块石头的重量 II相关推荐
- 【打卡第241道】【动态规划DP01背包】【leetCode高频】:1049. 最后一块石头的重量 II
1.题目描述 有一堆石头,用整数数组 stones 表示.其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 ...
- 153、【动态规划】leetcode ——1049. 最后一块石头的重量 II:滚动数组(C++版本)
题目描述 原题链接:1049. 最后一块石头的重量 II 解题思路 本题要找的是最小重量,我们可以将石头划分成两个集合,当两个集合的重量越接近时,相减后,可达到的装量就会是最小,此时本题的思路其实就类 ...
- LeetCode刷题day43|1049. 最后一块石头的重量 II、 494. 目标和、474.一和零
文章目录 一.1049. 最后一块石头的重量 II 二.494. 目标和 三.474.一和零 一.1049. 最后一块石头的重量 II 这道题其实就与"分割子集"一样,就是先将总和 ...
- 代码随想录刷题|LeetCode 1049. 最后一块石头的重量II 494. 目标和 474.一和零
目录 1049. 最后一块石头的重量 II 思路 最后一块石头的重量|| 494. 目标和 思路 0.求什么 1.确定dp数组的含义 2.递推公式 3.初始化dp数组 4.遍历顺序 目标和 474.一 ...
- LeetCode:1049.最后一块石头的重量II 494.目标和 474.一和零
1049.最后一块石头的重量II 题目 有一堆石头,用整数数组 stones 表示.其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的 ...
- 代码随想录算法训练营day42 |动态规划之背包问题 11.分割等和子集 1049. 最后一块石头的重量 II 494. 目标和
day42 11.分割等和子集 1.dp数组的含义 2.确定递推公式 3.dp数组初始化 4.确定遍历顺序 5.打印dp数组 1049. 最后一块石头的重量 II 1.确定dp数组以及下标的含义 2. ...
- LeetCode 1049. 最后一块石头的重量 II
1049. 最后一块石头的重量 II 无论按照何种顺序粉碎石头,最后一块石头的重量总是可以表示成 可以这样理解,将所有的石头分为两堆,ki=1的石头是一堆,ki=-1的石头是另一堆,我们的目标就是求上 ...
- day36|1049. 最后一块石头的重量 II、494. 目标和、474.一和零
1049. 最后一块石头的重量 II 有一堆石头,用整数数组 stones 表示.其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的重 ...
- 【43天|1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零 】
1049. 最后一块石头的重量 II dp[j] 表示j容量的背包可以背下石头的最大重量. class Solution {public:int lastStoneWeightII(vector< ...
最新文章
- BDTC 2017丨大数据在金融、交通、医疗、工业领域落地实践与应用
- AI芯片市场,到底是怎么一回事?
- 清华发布《中国AI发展报告2018》:中科院系统AI论文产出全球第一
- 【Flutter】创建 Flutter 项目 ( Android Studio 创建并运行 Flutter 应用 | 命令行创建并运行 Flutter 应用 | 运行 Flutter 应用三种方式 )
- UDF、UDAF、UDTF函数编写
- CodeForce 534C Polycarpus' Dice (数学推理)
- Struts2 入门
- C/C++基础知识:函数指针和指针函数的基本概念
- js ajax java传参_ajax参数传递与后台接收
- 【记忆化搜索】【dfs】【递归】Chocolate
- Hbase 表名修改
- linux ll以编码格式_在Linux中文件的编码及对文件进行编码转换
- 2. Zend_Controller 快速入门
- 手把手原生js简单轮播图
- 终极算法【3】——符号学派
- html5游戏ztype源码,Ztype打字游戏!
- FAST-LIO2.0代码解析(一)preprocess.h
- 浅谈为什么倒序遍历List删除元素没有问题
- 表值函数和标量值函数
- 人脸与关键点检测:YOLO5Face实战
热门文章
- 树莓派用服务方式设置开机启动
- CSP认证201403-2窗口[C++题解]:模拟、结构体
- PAT甲级1061 Dating:[C++题解]字符串处理(C语言格式控制牛逼!)
- 2020年汤家凤直播讲解1800题基础篇手写笔记-不定积分和定积分部分
- mod php是什么意思,mod函数是什么意思
- setwindowshookex回调函数不执行_不一样的“悬停几秒后执行函数”?一个开源工具函数,请注意查收...
- C++中成员函数和成员变量的隶属问题
- 微型计算机原理实验报告总结,微机原理实验报告-两个多位十进制数相加的实验等.doc...
- php mysql update 返回_php mysql_query增删改查(update delete insert)返回值类型
- php中pre标签,html中pre标签与code标签的作用与用法