leetcode 1049 最后一块石头的重量
最后一块石头的重量
本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成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 最后一块石头的重量相关推荐
- LeetCode 1049. 最后一块石头的重量 II
1049. 最后一块石头的重量 II 无论按照何种顺序粉碎石头,最后一块石头的重量总是可以表示成 可以这样理解,将所有的石头分为两堆,ki=1的石头是一堆,ki=-1的石头是另一堆,我们的目标就是求上 ...
- LeetCode 1049. 最后一块石头的重量 II(DP)
1. 题目 有一堆石头,每块石头的重量都是正整数. 每一回合,从中选出任意两块石头,然后将它们一起粉碎. 假设石头的重量分别为 x 和 y,且 x <= y.那么粉碎的可能结果如下: 如果 x ...
- 153、【动态规划】leetcode ——1049. 最后一块石头的重量 II:滚动数组(C++版本)
题目描述 原题链接:1049. 最后一块石头的重量 II 解题思路 本题要找的是最小重量,我们可以将石头划分成两个集合,当两个集合的重量越接近时,相减后,可达到的装量就会是最小,此时本题的思路其实就类 ...
- 代码随想录刷题|LeetCode 1049. 最后一块石头的重量II 494. 目标和 474.一和零
目录 1049. 最后一块石头的重量 II 思路 最后一块石头的重量|| 494. 目标和 思路 0.求什么 1.确定dp数组的含义 2.递推公式 3.初始化dp数组 4.遍历顺序 目标和 474.一 ...
- 2022-2-19 Leetcode 1049.最后一块石头的重量II
例二分析:26+21-40 = 7 33-31 = 2 7-2 = 5 相当于小块石头集合之后一起去砸大石头. 这道题和最后一块石头的重量I 有什么不同? 例子更复杂了.(虽然不知道复杂在哪里) 这道 ...
- LeetCode 1049. 最后一块石头的重量 II 做题小结
题目 有一堆石头,每块石头的重量都是正整数.每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 x <= y.那么粉碎的可能结果如下:如果 x == y,那 ...
- 95. Leetcode 1049. 最后一块石头的重量 II (动态规划-背包问题)
步骤一.确定状态: 确定dp数组及含义 dp[i]表示的是: 背包的容量为i的情况下,所能得到物品的最大值 这里的物品容量和物品价值都是石头的重量 步骤二.推断状态方程: dp[j] = max(dp ...
- leetcode - 1049. 最后一块石头的重量 II
这个问题可以转化为0-1背包问题,背包的大小为所有石头的重量之和的一半,意思就是找到要求的石头组合重量之和最接近所有石头重量的一半.具体的C++代码如下: class Solution { publi ...
- LeetCode 1046. 最后一块石头的重量(priority_queue 堆)
1. 题目 有一堆石头,每块石头的重量都是正整数. 每一回合,从中选出两块最重的石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 x <= y.那么粉碎的可能结果如下: 如果 x ...
最新文章
- python删除字典中性别为男_python初学者,用python3实现基本的学生管理系统代码实例...
- 以安装PyTorch为例说明Anaconda在Windows/Linux上的使用
- java调用方法返回数组_JAVA使用下面的方法头编写方法,返回两个数组列表的并集...
- VC 中一些控件的使用方法(TabControl, 工具栏)
- 爬虫_4、requests的post方法以及json字符串处理
- ARC070D No Need
- pythonindex函数的使用格式_Python正课31 —— 函数参数的使用
- android 市场 百度地图,百度地图 下载_地图导航软件_车载安卓应用_路畅市场
- 数字电路逻辑设计_第三版_微课版_第三章思考题与练习题(附答案)
- php-fpm配置 listen,php-fpm – 配置详解
- linux下ssh工具自动登录的实现
- python ndimage.gaussian_filter_Python ndimage.maximum_filter方法代碼示例
- 360Vulcan团队再获微软致谢 协助修复Edge及IE漏洞
- Eclipse没有Dynamic Web Project选项解决
- SpringCloud禁用Eureka自我保护模式
- HDU_4125 Moles 线段树
- evplayer android闪退,Evplayer优弊端汇总
- 如何集中自己的注意力
- Pycharm安装与入门
- JBOSS EAP实战(2)-集群、NGINX集成、队列与安全
热门文章
- 2023 手机号归属地查询库PHP源码
- 空天地一体化网络运营方法分析与挑战
- C++中sort函数
- android studio 查看jar包依赖关系 依赖树
- 论文笔记《MemSeg: A semi-supervised method for image surface defect detection using differences and comm》
- 如何在win7 中安装windows sdk 7.1
- docker部署项目
- java hanoi_JAVA:New towers of Hanoi
- 中国工程程院院士高文:从大数据科学到人工智能的迁移过程
- explicit的用法