將乙個陣列分成兩部分,不要求兩部分所包含的元素個數相等,要求使得這兩個部分的和的差值最小。比如對於陣列,可以分成和,使得這兩部分的差值最小。
這道題為什麼說是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種菜 每種菜可購買一次。已知每種菜的 以及卡上的餘額,問最少...