動態規劃 揹包問題
阿新 • • 發佈:2020-10-21
問題描述:
weight:物品重量,n:物品個數,w:揹包可承載重量 public int knapsack(int[] weight, int n, int w) { boolean[][] states = new boolean[n][w+1]; // 預設值falsestates[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; }