0 1揹包變形題

2021-09-11 22:26:16 字數 1289 閱讀 2964

將乙個陣列分成兩部分,不要求兩部分所包含的元素個數相等,要求使得這兩個部分的和的差值最小。比如對於陣列,可以分成和,使得這兩部分的差值最小。

這道題為什麼說是0-1揹包問題的變形呢,因為0-1揹包問題是每個蘋果裝或者不裝,使得能裝的總重量最重,這道題也類似,什麼時候兩個陣列的和的差值最小呢?當然是都為sum/2的時候,差值就是0啦,所以每個數都有要和不要這兩種情況,使得裝進去的總和更接近sum/2。

動態轉移方程為:

dp[i][j]表示第i個數時,最接近j的總和。

因此如果沒裝進去,當前總和等於上乙個數的總和。

d p[

i][j

]=dp

[i−1

][j]

dp[i][j]=dp[i-1][j]

dp[i][

j]=d

p[i−

1][j

]如果裝進去了,當前總和就是上乙個sum減去當前的這個數,所在的那個dp[i][j]加上當前的數

d p[

i][j

]=dp

[i−1

][j−

nums

[i]]

dp[i][j]=dp[i-1][j-nums[i]]

dp[i][

j]=d

p[i−

1][j

−num

s[i]

]所以最後就是dp[

i][j

]=ma

x(dp

[i−1

][j]

,dp[

i−1]

[j−n

ums[

i]]+

nums

[i])

dp[i][j]=max(dp[i-1][j],dp[i-1][j-nums[i]]+nums[i])

dp[i][

j]=m

ax(d

p[i−

1][j

],dp

[i−1

][j−

nums

[i]]

+num

s[i]

)注意要確保j-nums[i] >= 0,也就是說加上了當前的數,總和不能超過j了。

class solution 

else

}} };

這樣可以得到,最近接sum/2的和,但是目前只能得到分成兩個陣列,這兩個陣列的差值。

怎麼得到分的方法呢?倒退,如果dp[i][j]==dp[i-1][j]則說明這個i沒有被安排上,否則說明被安排上了。

01揹包變形

傳送門 現有n個物品,序號分別為1,2,n。對於每個i 1 i n 物品i有乙個體積wi和乙個價值vi。小明想在這n個物品中選取一些放到揹包裡帶回家。已知揹包的容積為w,這意味著所帶物品的總體積不能超過w。求出小明可以帶回家的物品總價值可能的最大值。constraints input 標準輸入格式如...

01揹包問題變形

一 問題 二 解題思路 三 c 下面是我自己理解寫的,沒有根據標準答案的,那答案在講啥?一直沒法ac,不過還是可以解決問題的。n件物品按單位重量價值降序排序,然後回溯法裝,右結點必要時剪枝,剛好湊成重量為m的若干件物品才能得到乙個解。include define max 50 using names...

變形的01揹包

電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買乙個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功 即使購買後卡上餘額為負 否則無法購買 即使金額足夠 所以大家都希望盡量使卡上的餘額最少。某天,食堂中有n種菜 每種菜可購買一次。已知每種菜的 以及卡上的餘額,問最少...