1049 最後一塊石頭的重量 II

2021-10-17 16:03:37 字數 1911 閱讀 7121

1049. 最後一塊石頭的重量 ii

有一堆石頭,每塊石頭的重量都是正整數。

每一回合,從中選出任意兩塊石頭,然後將它們一起粉碎。假設石頭的重量分別為 x 和 y,且 x <= y。那麼粉碎的可能結果如下:

如果 x == y,那麼兩塊石頭都會被完全粉碎;

如果 x != y,那麼重量為 x 的石頭將會完全粉碎,而重量為 y 的石頭新重量為 y-x。

最後,最多隻會剩下一塊石頭。返回此石頭最小的可能重量。如果沒有石頭剩下,就返回 0。

示例:

輸入:[2,7,4,1,8,1]

輸出:1

解釋:組合 2 和 4,得到 2,所以陣列轉化為 [2,7,1,8,1],

組合 7 和 8,得到 1,所以陣列轉化為 [2,1,1,1],

組合 2 和 1,得到 1,所以陣列轉化為 [1,1,1],

組合 1 和 1,得到 0,所以陣列轉化為 [1],這就是最優值。

1 <= stones.length <= 30

1 <= stones[i] <= 1000

基本思路:本題可以換種角度思考問題,假設stones=,那麼碰撞的結果只有,a-b-c,a-c-b,b-a-c,b-c-a,c-a-b,c-b-a,假設再新增乙個元素d,僅僅對於a-b-c這種形式,有a+d-b-c,a-b-c-d,d+b+c-a等等形式,不難發現,最後的結果實際上是對每個陣列上的元素進行加減法得到的,共有2^(n)中結果,直接計算結果有點大,可以採用bitset來做。

對於上述結果,其實可以進一步發現,如果把加法算為一堆,令其結果為x,減法算為一堆,令其結果為y,那麼最終結果為abs(x-y),這代表,其實我們可以把問題轉換成,把石頭分為兩堆,使其大小盡量相等,即target=sum/2,問題直接轉換成0-1揹包問題。

const int capacity = 60002;

const int bound = 30001;

int laststoneweightii(vector& stones)

for (int i = 0; i < bound; i++)

return -1;

}

基本思路:動態規劃,既可以用上面的思路,也可以採用下面的思路思考問題,以上面的例子[2,7,4,1,8,1]為例:

組合2,4:[<4-2>,7,1,81]

組合7,8:[<4-2>,<8-7>,1,1]

組合2,1: [<4-2-1>,<8-7>,1]

組合1,2:[<4-2-1-1>,<8-7>]  <===> [<8-7-(4-2-1-1)>] <===> [<(8+2+1+1)-(7+4)>] <===>[<12-11>] <===>

上述問題可以轉化為分成兩堆,8,2,1,1一堆,7和4一堆,結果為兩堆結果差的絕對值

總結:對於上述任何問題都可以最終表達為f=x1-x2-x3……-xk=x1-(x2+x3+……+xk)=(s1+s2+……+sr)-(t1+t2+……+tp),注意這裡每乙個xi都可能是乙個複數表達(即有多個石頭變換得到),而si和ti都是單個的石頭,等價於將其分為兩堆,使其盡量平均,g=min(f)=min(sum(s)-sum(t)),等價於求最接近sum/2的堆的大小,故我們可以令target=sum/2,使用0-1揹包的思路解決問題。

int laststoneweightii(vector& stones) 

int target=sum>>1;

vectordp(target+1,0);

for(auto &it:stones)

}return sum-2*dp[target];

}

1049 最後一塊石頭的重量 II

有一堆石頭,用整數陣列stones表示。其中stones i 表示第i塊石頭的重量。每一回合,從中選出任意兩塊石頭,然後將它們一起粉碎。假設石頭的重量分別為x和y,且x y。那麼粉碎的可能結果如下 最後,最多隻會剩下一塊石頭。返回此石頭最小的可能重量。如果沒有石頭剩下,就返回0。示例 1 輸入 st...

最後一塊石頭重量

有一堆石頭,每塊石頭的重量都是正整數。每一回合,從中選出兩塊 最重的 石頭,然後將它們一起粉碎。假設石頭的重量分別為 x 和 y,且 x y。那麼粉碎的可能結果如下 如果 x y,那麼兩塊石頭都會被完全粉碎 如果 x y,那麼重量為 x 的石頭將會完全粉碎,而重量為 y 的石頭新重量為 y x。最後...

C語言重構 1049 最後一塊石頭的重量 II

所有題目源 git位址 題目有一堆石頭,每塊石頭的重量都是正整數。每一回合,從中選出任意兩塊石頭,然後將它們一起粉碎。假設石頭的重量分別為 x 和 y,且 x y。那麼粉碎的可能結果如下 如果 x y,那麼兩塊石頭都會被完全粉碎 如果 x y,那麼重量為 x 的石頭將會完全粉碎,而重量為 y 的石頭...