思路:每次循环,sort将这堆石头从大到小排序,拿出最重的两块石头粉碎,若粉碎后的值不为0,则存入stones中,再做sort从大到小排序,直到stones的size<2为止。
class Solution {public: int lastStoneWeight(vector & stones) { int s = 0; sort(stones.begin(), stones.end(), greater ()); while(stones.size()>=2){ s = stones[0] - stones[1]; stones.erase(stones.begin(), stones.begin()+2); if(s != 0){ stones.push_back(s); sort(stones.begin(), stones.end(), greater ()); } } return stones.empty()? 0 : stones[0]; }};
思路:相当于把这堆石头分为两堆,让其中一堆的值尽可能的接近于输入总和的一半。
动态规划:维护一个dp[i][j] :行表示索引为i时对应的这块石头,最大的重量为j时,得到的当前堆的重量。
class Solution {public: int lastStoneWeightII(vector & stones) { int size = stones.size(); if(size==0) return 0; else if(size==1) return size; int sum = 0; for(int i=0; i