1. 程式人生 > 實用技巧 >動態規劃 揹包問題

動態規劃 揹包問題

問題描述:

https://time.geekbang.org/column/article/74788?utm_campaign=guanwang&utm_source=baidu-ad&utm_medium=ppzq-pc&utm_content=title&utm_term=baidu-ad-ppzq-title

weight:物品重量,n:物品個數,w:揹包可承載重量
public int knapsack(int[] weight, int n, int w) {
  boolean[][] states = new boolean[n][w+1]; // 預設值false
states[0][0] = true; // 第一行的資料要特殊處理,可以利用哨兵優化 if (weight[0] <= w) { states[0][weight[0]] = true; } for (int i = 1; i < n; ++i) { // 動態規劃狀態轉移
//--其實就是把states[i-1][j] 的資料,copy到下一個狀態states[i],應為下一個狀態要使用本次states做重量累加 for (int j = 0; j <= w; ++j) {// 不把第i個物品放入揹包 if (states[i-1][j] == true
) states[i][j] = states[i-1][j]; }
//這裡做重量判斷,沒超過揹包重量就塞進包裡,j+weight[i]其實j代表的是揹包當前的重量,+weight[i]
for (int j = 0; j <= w-weight[i]; ++j) {//把第i個物品放入揹包 if (states[i-1][j]==true) states[i][j+weight[i]] = true; } } for (int i = w; i >= 0; --i) { // 輸出結果 if (states[n-1][i] == true
) return i; } return 0; }