描述

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相关推荐

  1. 【打卡第241道】【动态规划DP01背包】【leetCode高频】:1049. 最后一块石头的重量 II

    1.题目描述 有一堆石头,用整数数组 stones 表示.其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 ...

  2. 153、【动态规划】leetcode ——1049. 最后一块石头的重量 II:滚动数组(C++版本)

    题目描述 原题链接:1049. 最后一块石头的重量 II 解题思路 本题要找的是最小重量,我们可以将石头划分成两个集合,当两个集合的重量越接近时,相减后,可达到的装量就会是最小,此时本题的思路其实就类 ...

  3. LeetCode刷题day43|1049. 最后一块石头的重量 II、 494. 目标和、474.一和零

    文章目录 一.1049. 最后一块石头的重量 II 二.494. 目标和 三.474.一和零 一.1049. 最后一块石头的重量 II 这道题其实就与"分割子集"一样,就是先将总和 ...

  4. 代码随想录刷题|LeetCode 1049. 最后一块石头的重量II 494. 目标和 474.一和零

    目录 1049. 最后一块石头的重量 II 思路 最后一块石头的重量|| 494. 目标和 思路 0.求什么 1.确定dp数组的含义 2.递推公式 3.初始化dp数组 4.遍历顺序 目标和 474.一 ...

  5. LeetCode:1049.最后一块石头的重量II 494.目标和 474.一和零

    1049.最后一块石头的重量II 题目 有一堆石头,用整数数组 stones 表示.其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的 ...

  6. 代码随想录算法训练营day42 |动态规划之背包问题 11.分割等和子集 1049. 最后一块石头的重量 II 494. 目标和

    day42 11.分割等和子集 1.dp数组的含义 2.确定递推公式 3.dp数组初始化 4.确定遍历顺序 5.打印dp数组 1049. 最后一块石头的重量 II 1.确定dp数组以及下标的含义 2. ...

  7. LeetCode 1049. 最后一块石头的重量 II

    1049. 最后一块石头的重量 II 无论按照何种顺序粉碎石头,最后一块石头的重量总是可以表示成 可以这样理解,将所有的石头分为两堆,ki=1的石头是一堆,ki=-1的石头是另一堆,我们的目标就是求上 ...

  8. day36|1049. 最后一块石头的重量 II、494. 目标和、474.一和零

    1049. 最后一块石头的重量 II 有一堆石头,用整数数组 stones 表示.其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的重 ...

  9. 【43天|1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零 】

    1049. 最后一块石头的重量 II dp[j] 表示j容量的背包可以背下石头的最大重量. class Solution {public:int lastStoneWeightII(vector< ...

最新文章

  1. BDTC 2017丨大数据在金融、交通、医疗、工业领域落地实践与应用
  2. AI芯片市场,到底是怎么一回事?
  3. 清华发布《中国AI发展报告2018》:中科院系统AI论文产出全球第一
  4. 【Flutter】创建 Flutter 项目 ( Android Studio 创建并运行 Flutter 应用 | 命令行创建并运行 Flutter 应用 | 运行 Flutter 应用三种方式 )
  5. UDF、UDAF、UDTF函数编写
  6. CodeForce 534C Polycarpus' Dice (数学推理)
  7. Struts2 入门
  8. C/C++基础知识:函数指针和指针函数的基本概念
  9. js ajax java传参_ajax参数传递与后台接收
  10. 【记忆化搜索】【dfs】【递归】Chocolate
  11. Hbase 表名修改
  12. linux ll以编码格式_在Linux中文件的编码及对文件进行编码转换
  13. 2. Zend_Controller 快速入门
  14. 手把手原生js简单轮播图
  15. 终极算法【3】——符号学派
  16. html5游戏ztype源码,Ztype打字游戏!
  17. FAST-LIO2.0代码解析(一)preprocess.h
  18. 浅谈为什么倒序遍历List删除元素没有问题
  19. 表值函数和标量值函数
  20. 人脸与关键点检测:YOLO5Face实战

热门文章

  1. 树莓派用服务方式设置开机启动
  2. CSP认证201403-2窗口[C++题解]:模拟、结构体
  3. PAT甲级1061 Dating:[C++题解]字符串处理(C语言格式控制牛逼!)
  4. 2020年汤家凤直播讲解1800题基础篇手写笔记-不定积分和定积分部分
  5. mod php是什么意思,mod函数是什么意思
  6. setwindowshookex回调函数不执行_不一样的“悬停几秒后执行函数”?一个开源工具函数,请注意查收...
  7. C++中成员函数和成员变量的隶属问题
  8. 微型计算机原理实验报告总结,微机原理实验报告-两个多位十进制数相加的实验等.doc...
  9. php mysql update 返回_php mysql_query增删改查(update delete insert)返回值类型
  10. php中pre标签,html中pre标签与code标签的作用与用法