動態規劃與揹包問題

2022-03-05 21:05:30 字數 3203 閱讀 2737

應用場景-揹包問題

物品

重量

**

吉他(g)

11500

音響(s)

43000

電腦(l)

32000

揹包問題:有乙個揹包,容量為4磅 , 現有如下物品

要求達到的目標為裝入的揹包的總價值最大,並且重量不超出

要求裝入的物品不能重複

動態規劃演算法介紹

動態規劃(dynamic programming)演算法的核心思想是:將大問題劃分為小問題進行解決,從而一步步獲取最優解的處理演算法

動態規劃演算法與分治演算法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。

分治法不同的是適合於用動態規劃求解的問題,經分解得到子問題往往不是互相獨立的。( 即下乙個子階段的求解是建立在上乙個子階段的解的基礎上,進行進一步的求解 )

動態規劃可以通過填表的方式(便於理解)來逐步推進,得到最優解.

應用場景-揹包問題-解決思路

物品

重量

**

吉他(g)

11500

音響(s)

43000

電腦(l)

32000

揹包問題:有乙個揹包,容量為4磅 , 現有如下物品

要求達到的目標為裝入的揹包的總價值最大,並且重量不超出

要求裝入的物品不能重複

思路分析和**

演算法的主要思想,利用動態規劃來解決。每次遍歷到的第i個物品,根據w[i]和v[i]來確定是否需要將該物品放入揹包中。即對於給定的n個物品,設v[i]w[i]分別為i個物品的價值和重量,c為揹包的容量。再令v[i][j]表示在前i個物品中能夠裝入容量為j的揹包中的最大價值。則我們有下面的結果:

(1)  v[i][0]=v[0][j]=0; //表示 填入表 第一行和第一列是0

(2) 當w[i]>

j 時:v[i][j]=v[i-1][j]

// 當準備加入新增的商品的容量大於 當前揹包的容量         時,就直接使用上乙個單元格的裝入策略

(3) 當j>=w[i]時:

v[i][j]=max  

//

準備加入的新增的商品的容量小於等於當前揹包的容量,

// 裝入的方式:

v[i] : 表示當前商品的價值

v[i-1][j-w[i]] : 裝入i-1商品,到剩餘空間j-w[i]的最大值

v[i]+v[i-1][j-w[i]]就是先把當前商品加入揹包 再加入當前剩餘空間可以放的最大價值的商品 (上面那句不好理解 看這句 直接就解釋了後半句是什麼意思)

max看那個策略可以放入價值更高的商品

當j>=w[i]時: v[i][j]=max :

使用填表過程來理解揹包問題 先是自己用人的思維

再把公式代入 找乙個結果 進行驗算 理解這個公式

完整**

package

com.atguigu.dynamic;

public

class

knapsackproblem ;//

物品的重量

int val = ; //

物品的價值 這裡val[i] 就是前面講的v[i]

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];

//初始化第一行和第一列, 這裡在本程式中,可以不去處理,因為預設就是0

for(int i = 0; i < v.length; i++)

for(int i=0; i < v[0].length; i++)

//根據前面得到公式來動態規劃處理

for(int i = 1; i < v.length; i++)

else

else}}

}//輸出一下v 看看目前的情況 就是列印那張表

for(int i =0; i < v.length;i++)

system.out.println();

}system.out.println("*************************===");

//輸出最後我們是放入的哪些商品

//遍歷path, 這樣輸出會把所有的放入情況都得到, 其實我們只需要最後的放入

//for(int i = 0; i < path.length; i++)

//}//}

//動腦筋 將最優的解中的商品輸出 是通過計算出來的

int i = path.length - 1; //

行的最大下標

int j = path[0].length - 1; //

列的最大下標

while(i > 0 && j > 0 )

i--;}}

}

動態規劃 揹包問題

給定n個物品,重量是,價值是,包的容量 承重 是w 問,放入哪些物品能使得包內價值最大 1 需要將問題轉化為子問題,通過遞迴實現,且子問題必然與父問題存在關聯 2 定義v i,j 表示為,當item取自前i個items且揹包capacity j 時,揹包問題的最優解,也即最高的價值。3 從前i個it...

動態規劃 揹包問題

不廢話,直接上 動態規劃,揹包問題。輸入為 int n 物品的種類數。int n weight 各件物品的重量。int n value 各種物品的價值。int w 揹包最大的裝載重量。輸出 v n b 的值,最大的裝載價值。x n 各類物品的裝載數量。author huangyongye publi...

動態規劃 揹包問題

1 開心的金明 問題描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n 元。於是,他把每...