原题链接:https://leetcode-cn.com/problems/last-stone-weight-ii/

这个题目可以转化成0-1背包问题,非常巧妙。把问题看成有两堆石头,求如何将使两堆石头尽可能接近sum/2,于是转化成0-1背包问题:背包容量为sum/2,求如何装能装下最多。

dp[i]表示背包容量为i时,能装下的最多的石头重量

状态转移:

dp[i]=max(dp[i],dp[i-stones[j]]+stones[j])//比较放不放石头进去的重总量

代码:

int lastStoneWeightII(vector<int>& stones) {int len=stones.size();int sum=accumulate(stones.begin(),stones.end(),0);vector<int> dp(sum/2+1,0);        for(int j=0;j<len;j++){for(int i=sum/2;i>=stones[j];i--){dp[i]=max(dp[i],dp[i-stones[j]]+stones[j]);//放入石头和不放入比较}}return sum-2*dp[sum/2];
}

另外对背包问题的解决思路:

背包问题具备的特征:给定一个target,target可以是数字也可以是字符串,再给定一个数组nums,nums中装的可能是数字,也可能是字符串,问:能否使用nums中的元素做各种排列组合得到target。

1.如果是0-1背包,即数组中的元素不可重复使用,nums放在外循环,target在内循环,且内循环倒序;

for num in nums:for i in range(target, nums-1, -1):

2.如果是完全背包,即数组中的元素可重复使用,nums放在外循环,target在内循环。且内循环正序。

for num in nums:for i in range(nums, target+1):

3.如果组合问题需考虑元素之间的顺序且数组中元素可重复使用,需将target放在外循环,将nums放在内循环。

for i in range(1, target+1):for num in nums:

参考链接:https://leetcode-cn.com/problems/combination-sum-iv/solution/xi-wang-yong-yi-chong-gui-lu-gao-ding-bei-bao-wen-/

leetcode算法题--最后一块石头的重量 II★相关推荐

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

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

  2. Leetcode 1049:最后一块石头的重量 II(超详细的解法!!!)

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

  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. 153、【动态规划】leetcode ——1049. 最后一块石头的重量 II:滚动数组(C++版本)

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

  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 有一堆石头,用整数数组 stones 表示.其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石 ...

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

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

  9. leetcode1049. 最后一块石头的重量 II(java)

    最后一块石头的重量 II leetcode1049. 最后一块石头的重量 II 题目描述 解题思路 解法一 暴力递归 解法二 动态规划 动态规划专题 leetcode1049. 最后一块石头的重量 I ...

最新文章

  1. dataTables-使用详细说明整理
  2. php+如何按文字分割文件夹,PHP实现的大文件切割与合并功能示例
  3. SSH整合中,使用父action重构子类action类.(在父类中获取子类中的泛型对象)
  4. 用NSubstitute来mock
  5. mysql 远程load data,PyMySQL将(文件)数据加载到远程MySQL实例时发生错误/异常
  6. 云联惠身份认证得多久_【转发扩散】你完成认证了吗?老来网APP也可以刷脸认证哦!...
  7. android 通过访问 php 接受 or 传送数据
  8. 【hihocoder 1499】A Box of Coins
  9. Literal Web 服务器控件
  10. 软件测试技术——安全性测试
  11. 怎么设置计算机网络访问权限,Win7无Internet访问权限怎么解决?
  12. 工业无线开关量信号传输器
  13. php话费充值接口,手机话费充值接口
  14. [并查集]BZOJ 1050——[HAOI2006]旅行comf
  15. visio2013取消跨线(交叉时凸起的小圆弧)
  16. C语言实现,输入某年某月某日,判断这一天是这一年的第几天?
  17. 村庄规划gis基础操作详细步骤
  18. BUUCTF basic PikaChu AWD-Test1 Webug 4.0
  19. 大恒工业相机C#语言winform平台开发例程
  20. python目前有多少库存_统计库存数量的软件,库存有多少,一键统计查询

热门文章

  1. python上海培训哪里比较好-上海python培训哪家好 Python需要多久学会
  2. python怎么学最快-怎么样快速高效学习Python
  3. python3入门教程-Python3 入门教程 简单但比较不错
  4. 关于python中程序流程结构-四、python基础(程序目录结构规范)
  5. python从入门到精通书-清华大学出版社-图书详情-《Python从入门到精通》
  6. python一般用什么编译器-Python常用的编辑器有哪些?老男孩Python
  7. python读取文件多行内容-python 逐行读取文件的几种方法
  8. python入门教程完整版-Python入门教程完整版(懂中文就能学会)
  9. LA4238 Area of Polycubes(立方体的表面积)
  10. libqrencode生成二维码图片的问题