問題描述:
揹包的容量是v,能承受的最大的重量是m
有n個物品,v, m, w陣列中分別存放著每個物品的體積,重量,價值
求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,物品的總重不超過揹包能承受的最大重量,且總價值最大
思路分析:
方案一:
dp陣列的含義是:揹包在一定的體積和重量下,可以獲得的最大價值
假設現在要裝第i件物品,那麼dp[i - 1]儲存的就是裝這件物品之前的所有物品可以獲得的最大價值,通過裝第i件物品,實現dp[i]的更新,更新為包括第i件物品可以獲得的最大價值。所以下面的**對應的是dp[i - 1]
在體積為j,重量為k的條件下,裝入第i件物品,體積得騰出v[i],重量也得騰出m[i],這樣才可以裝下第i件物品,如果可以裝下,那麼揹包的價值在 dp[i - 1][j - v[i]][k - m[i]] 的條件下增加了w[i],和之前的進行比較,選出最優解
dp[i]
[j][k]
= math.
max(dp[i -1]
[j][k]
, dp[i -1]
[j - v[i]
][k - m[i]
]+ w[i]
);
優化版:
和之前的一樣,咱們需要的資料只有dp[i - 1],如果從後往前遍歷就不會破壞原來的dp[i - 1]資料
dp[j]
[k]= math.
max(dp[j]
[k], dp[j - v[i]
][k - m[i]
]+ w[i]
);
**:public
class
main
else}}
}return dp[n]
[v][m];}
//優化
public
inttwo_dimension2()
else}}
}}}
二維費用的揹包問題
問題 二維費用的揹包問題是指 對於每件物品,具有兩種不同的費用 選擇這件物品必須同時付出這兩種代價 對於每種代價都有乙個可付出的最大值 揹包容量 問怎樣選擇物品可以得到最大的價值。設這兩種代價分別為代價1和代價2,第i件物品所需的兩種代價分別為a i 和b i 兩種代價可付出的最大值 兩種揹包容量 ...
二維費用的揹包問題
題目 toj3596 題意 有n張光碟,每張光碟有乙個價錢,現在要從n張光碟中買m張,預算為l,每張光碟有乙個快樂值,要求在不超過預算並且恰好買m張,使得快樂值最大。解答 典型的二維費用揹包問題,另外一種隱含的費用為個數,每個物品的個數費用為1。要求恰好買m張表示要求恰好裝滿,所以初始化不是0,而是...
二維費用的揹包問題
有 n nn 件物品和乙個容量是 v vv 的揹包,揹包能承受的最大重量是 mmm。每件物品只能用一次。體積是 v iv i vi 重量是 m im i mi 價值是 w iw i wi 求解將哪些物品裝入揹包,可使物品總體積不超過揹包容量,總重量不超過揹包可承受的最大重量,且價值總和最大。輸出最大...