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

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

  整体题目不难,难点在于思考出来本题的解法。

  在一开始看题的时候,第一反应是贪心,然而样例二就贪心失败,这样就让我思考,每次选取最大的两个不行,那就是需要列出所有情况,也就是每个数是正是负的情况。

  想到这里题目就能转化一下了,把所有数分成两个集合,他们的集合差最下就是结。

  所以,这道题也成为了一个显而易见的01背包,背包上限就是和的二分之一。

class Solution 
{
public:
    int lastStoneWeightII( vector<int>& stones ) 
    {
        int sum = 0;
        for ( auto stone : stones ) sum += stone;
        int size = sum / 2;
        vector<int> bag(size + 1 );
        bag[0] = 1;
        for ( auto stone : stones )
        {
            if ( stone > size ) continue;
            for ( int i = size - stone; i >=0; --i )
            {
                if ( bag[i] == 1 )
                {
                    bag[i + stone] = 1;
                }
            }
        }
        int res = 0;
        for ( int i = size; i >= 0; --i )
        {
            if ( bag[i] == 1 ) 
            {
                res = i;
                break;
            }
        }
        return sum - 2 * res;
    }
};

 

posted on 2021-06-08 17:02  LLawliet  阅读(39)  评论(0编辑  收藏  举报

导航