leetcode 1049 最后一块石头的重量

简介: leetcode 1049 最后一块石头的重量

最后一块石头的重量

002c6dc8360b453aace8c0d3f1c55b81.png

本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成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;
    }
};

动态规划(滚动数组)


99498246c31d401a95fce366a91ac74d.png

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 -766.托普利茨矩阵 -771.宝石与石头】
【Leetcode -766.托普利茨矩阵 -771.宝石与石头】
55 0
|
4月前
|
Python
【Leetcode刷题Python】1049. 最后一块石头的重量 II
LeetCode 1049题 "最后一块石头的重量 II" 的Python解决方案,通过动态规划算法计算使最后一块石头的重量最小的方案。
42 1
|
6月前
dp表,哈希表,力扣5.最长回文子串力扣1745.分割回文串IV力扣132.分割回文串II优先级队列(堆)是什么下面是手动实现小根堆力扣1046.最后一块石头的重量
dp表,哈希表,力扣5.最长回文子串力扣1745.分割回文串IV力扣132.分割回文串II优先级队列(堆)是什么下面是手动实现小根堆力扣1046.最后一块石头的重量
|
7月前
代码随想录Day36 动态规划05 LeetCode T1049最后一块石头的重量II T494 目标和 T474 一和零
代码随想录Day36 动态规划05 LeetCode T1049最后一块石头的重量II T494 目标和 T474 一和零
59 0
|
7月前
|
Java
leetcode-1049. 最后一块石头的重量 II
leetcode-1049. 最后一块石头的重量 II
55 0
|
算法 测试技术 容器
代码随想录算法训练营第四十二天 | LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零
代码随想录算法训练营第四十二天 | LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零
49 1
|
算法 Java
最后一块石头的重量 II(LeetCode 1049)
最后一块石头的重量 II(LeetCode 1049)
88 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
62 6
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
124 2