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];
    }
};
相关文章
|
8月前
【Leetcode -766.托普利茨矩阵 -771.宝石与石头】
【Leetcode -766.托普利茨矩阵 -771.宝石与石头】
38 0
|
20天前
dp表,哈希表,力扣5.最长回文子串力扣1745.分割回文串IV力扣132.分割回文串II优先级队列(堆)是什么下面是手动实现小根堆力扣1046.最后一块石头的重量
dp表,哈希表,力扣5.最长回文子串力扣1745.分割回文串IV力扣132.分割回文串II优先级队列(堆)是什么下面是手动实现小根堆力扣1046.最后一块石头的重量
|
1月前
代码随想录Day36 动态规划05 LeetCode T1049最后一块石头的重量II T494 目标和 T474 一和零
代码随想录Day36 动态规划05 LeetCode T1049最后一块石头的重量II T494 目标和 T474 一和零
40 0
|
1月前
|
Java
leetcode-1049. 最后一块石头的重量 II
leetcode-1049. 最后一块石头的重量 II
30 0
|
7月前
|
算法 测试技术 容器
代码随想录算法训练营第四十二天 | LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零
代码随想录算法训练营第四十二天 | LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零
33 1
力扣刷题记录——709. 转换成小写字母、771. 宝石与石头、704. 二分查找
力扣刷题记录——709. 转换成小写字母、771. 宝石与石头、704. 二分查找
力扣刷题记录——709. 转换成小写字母、771. 宝石与石头、704. 二分查找
|
算法 Java
最后一块石头的重量 II(LeetCode 1049)
最后一块石头的重量 II(LeetCode 1049)
64 0
|
11天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
11天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
12天前
|
索引
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值