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; } };