動態規劃解決揹包問題

2021-10-02 04:06:53 字數 2022 閱讀 7440

一、需求

二、思路分析

三、**實現

四、**優化

上述**的問題

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 讀入資料的部分結束了...