一、需求
二、思路分析
三、**實現
四、**優化
上述**的問題
path陣列的遍歷
優化後的**
a:我現在有一張表,記錄了商品名稱,重量及**;
b:我還有乙個給定容量的揹包,這個揹包用來存放商品;
c:要求物品裝入揹包的價值最大,且重量不能超出;
d:要求轉入的物品不能重複(即01揹包問題);
a:定義兩個一維陣列來分別表示商品和揹包容量;
b:同樣,需要乙個二維陣列v[i][j]來表示在揹包容量為j時,前i個商品能裝入揹包的最大價值;
c:根據a和b手動畫出**,然後根據**分析規律;
// 商品的價值
int val = ;
// 揹包的容量
int m = 4;
// 商品的個數
int n = val.length;
// 建立二維陣列
// v[i][j]表示前i個商品中能夠裝入揹包容量為j的最大價值
int v = new int[n + 1][m + 1];
for (int i = 0; i < n + 1; i++)
// 沒有商品的情況
for (int j = 0; j < m + 1; j++)
// 根據規律寫**
for (int i = 1; i < n + 1; i++) else
}} // 輸出一下
for (int i = 0; i < n + 1; i++)
system.out.println();
} }}
a:上述**相當於把**給列印出來了,但是並不知道是哪幾個商品放入到了揹包中使得價值最大;
b:所以,需要定義乙個二維陣列path,來記錄商品的存放情況,當商品加入揹包並更新最大價值時,
記錄此時的path[i][j]=1;
a:若從0開始對path陣列進行遍歷,那麼凡是path[i][j]=1的,都會輸出,造成資料冗餘;
b:因此,嘗試從後往前遍歷,最大的價值肯定在最後;
package cn.itcast_01;
public class dynamicdemo2 ;
// 商品的價值
int val = ;
// 揹包的容量
int m = 4;
// 商品的個數
int n = val.length;
// 建立二維陣列
// v[i][j]表示前i個商品中能夠裝入揹包容量為j的最大價值
int v = new int[n + 1][m + 1];
// 定義二維陣列記錄商品的存放情況
int path = new int[n + 1][m + 1];
for (int i = 0; i < n + 1; i++)
// 沒有商品的情況
for (int j = 0; j < m + 1; j++)
// 根據規律寫**
for (int i = 1; i < n + 1; i++) else else }}
} // 輸出一下
for (int i = 0; i < n + 1; i++)
system.out.println();
} // 輸出最後我們放入的是哪些商品
int i = n;
int j = m;
while (i > 0 && j > 0)
i--;
} }}
動態規劃解決01揹包問題
0 1揹包 動態規劃 問題描述 給定n種物品和一揹包。物品i的重量是wi,其價值是vi,揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?問題分析 對於一種問題,要麼裝入揹包,要麼不裝。所以對於一種物品的裝入狀態可以取0和1。eg 物品個數n 5,物品重量w n 物品價值v...
動態規劃解決0 1揹包問題
把揹包問題抽象化 x1,x2,xn,其中 xi 取0或1,表示第 i 個物品選或不選 vi表示第 i個物品的價值,wi表示第 i 個物品的體積 重量 建立模型,即求max v1x1 v2x2 vnxn 約束條件,w1x1 w2x2 wnxn定義v i,j 當前揹包容量 j,前 i 個物品最佳組合對應...
動態規劃解決01揹包問題
本程式旨在利用動態規劃解決有價值的0 1揹包問題 物品的大小和價值以及揹包的大小儲存在乙個放置在e盤根目錄下的的csv檔案中 include include include include include include using namespace std int main 讀入資料的部分結束了...