1049. Last Stone Weight II
https://leetcode.com/problems/last-stone-weight-ii/
題意:從一堆石頭里任選兩個石頭s1,s2,若s1==s2,則兩個石頭都被銷毀,否則加入s1<s2,剩下一塊重量為s2-s1的石頭。重復上面的操作,直至只剩一塊石頭,或沒有石頭。問最后剩下的石頭的重量最小為多少(0表示沒有剩余石頭)。
解法:
每次選兩塊石頭進行相減問最后一塊石頭重量最小為多少,可以看作是將所有石頭分為兩波,使兩波石頭的差值的絕對值最小。
使用背包(snapsack)解決。dp[i]表示stones是否能組成重量為i的group。
class Solution { public: int lastStoneWeightII(vector<int>& stones) { int sum = accumulate(stones.begin(),stones.end(),0); vector<bool> dp(sum/2,0); dp[0]=1; for(int s:stones) for(int j=sum/2;j>=s;j--) dp[j] = dp[j]|dp[j-s]; int res = sum; for(int i=0;i<=sum/2;i++) res = min(res, sum-dp[i]*i*2); return res; } };