最后一块石头的重量


本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。

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

动态规划(二维数组)

找到总重量最接近sum/2 的背包,这是一个石头堆。
和另一个堆相减,就是剩下的

class Solution {public:int lastStoneWeightII(vector<int>& stones) {if(stones.size() == 1 ) return stones[0];int sum = 0;for(auto it:stones) sum += it;vector<vector<int>> dp (stones.size() , vector<int>( sum /2 + 1 , 0) ) ;for(int j=1 ; j<=sum/2 ;j++)if(j>=stones[0]) dp[0][j] = stones[0];//找到背包为sum/2以内最大的种类for(int i=1 ;i<stones.size() ;i++){for(int j=1 ; j<=sum/2 ;j++){if(j>=stones[i]) dp[i][j] = max( dp[i-1][j] , dp[i-1][j-stones[i]] + stones[i]);else dp[i][j] = dp[i-1][j];}}//找到最接近sum/2的背包int bag_max = 0;for(int i=0 ;i<stones.size() ;i++ ){if(dp[i][sum/2] > bag_max) bag_max = dp[i][sum/2];}//计算石头堆的差return (sum - bag_max) - bag_max;}
};

动态规划(滚动数组)

class Solution {public:int lastStoneWeightII(vector<int>& stones) {if(stones.size() == 1 ) return stones[0];int sum = 0;for(auto it:stones) sum += it;vector<int> dp (sum /2 + 1 , 0);for(int i=0 ;i<stones.size() ;i++){for(int j=sum/2 ; j>=0 ;j--){if(j>=stones[i]) dp[j] = max( dp[j] , dp[j-stones[i]] + stones[i]);else dp[j] = dp[j];}}return (sum - dp[sum/2]) - dp[sum/2];}
};

二刷

class Solution {public:int lastStoneWeightII(vector<int>& stones) {int sum = 0;for(auto it:stones) sum += it;// cout<<sum<<' '<<sum/2<<endl;vector<int> dp(sum/2+1,0);for(int i=0 ; i<stones.size();i++){for(int j=sum/2 ; j>=stones[i];j--){dp[j] = max(dp[j] , dp[j-stones[i]] + stones[i]);}}// cout<<dp[sum/2];return  sum - 2*dp[sum/2];}
};

leetcode 1049 最后一块石头的重量相关推荐

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

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

  2. LeetCode 1049. 最后一块石头的重量 II(DP)

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

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

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

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

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

  5. 2022-2-19 Leetcode 1049.最后一块石头的重量II

    例二分析:26+21-40 = 7 33-31 = 2 7-2 = 5 相当于小块石头集合之后一起去砸大石头. 这道题和最后一块石头的重量I 有什么不同? 例子更复杂了.(虽然不知道复杂在哪里) 这道 ...

  6. LeetCode 1049. 最后一块石头的重量 II 做题小结

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

  7. 95. Leetcode 1049. 最后一块石头的重量 II (动态规划-背包问题)

    步骤一.确定状态: 确定dp数组及含义 dp[i]表示的是: 背包的容量为i的情况下,所能得到物品的最大值 这里的物品容量和物品价值都是石头的重量 步骤二.推断状态方程: dp[j] = max(dp ...

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

    这个问题可以转化为0-1背包问题,背包的大小为所有石头的重量之和的一半,意思就是找到要求的石头组合重量之和最接近所有石头重量的一半.具体的C++代码如下: class Solution { publi ...

  9. LeetCode 1046. 最后一块石头的重量(priority_queue 堆)

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

最新文章

  1. python删除字典中性别为男_python初学者,用python3实现基本的学生管理系统代码实例...
  2. 以安装PyTorch为例说明Anaconda在Windows/Linux上的使用
  3. java调用方法返回数组_JAVA使用下面的方法头编写方法,返回两个数组列表的并集...
  4. VC 中一些控件的使用方法(TabControl, 工具栏)
  5. 爬虫_4、requests的post方法以及json字符串处理
  6. ARC070D No Need
  7. pythonindex函数的使用格式_Python正课31 —— 函数参数的使用
  8. android 市场 百度地图,百度地图 下载_地图导航软件_车载安卓应用_路畅市场
  9. 数字电路逻辑设计_第三版_微课版_第三章思考题与练习题(附答案)
  10. php-fpm配置 listen,php-fpm – 配置详解
  11. linux下ssh工具自动登录的实现
  12. python ndimage.gaussian_filter_Python ndimage.maximum_filter方法代碼示例
  13. 360Vulcan团队再获微软致谢 协助修复Edge及IE漏洞
  14. Eclipse没有Dynamic Web Project选项解决
  15. SpringCloud禁用Eureka自我保护模式
  16. HDU_4125 Moles 线段树
  17. evplayer android闪退,Evplayer优弊端汇总
  18. 如何集中自己的注意力
  19. Pycharm安装与入门
  20. JBOSS EAP实战(2)-集群、NGINX集成、队列与安全

热门文章

  1. 2023 手机号归属地查询库PHP源码
  2. 空天地一体化网络运营方法分析与挑战
  3. C++中sort函数
  4. android studio 查看jar包依赖关系 依赖树
  5. 论文笔记《MemSeg: A semi-supervised method for image surface defect detection using differences and comm》
  6. 如何在win7 中安装windows sdk 7.1
  7. docker部署项目
  8. java hanoi_JAVA:New towers of Hanoi
  9. 中国工程程院院士高文:从大数据科学到人工智能的迁移过程
  10. explicit的用法