01揹包 動態規劃(三)

2021-08-19 23:43:59 字數 1625 閱讀 2150

測試資料:

int n=5;//物品個數

int m=20;//揹包容量

int weight=new int;//物品重量

int value=new int;//物品價值

1.遞迴版本:

private static int knapsack(int n,int m,int w,int v) else if((m>w[n])&&((knapsack(n-1, m-w[n], w, v)+v[n])>knapsack(n-1, m, w, v)))else

}

2.分析可變引數,哪幾個可變引數的值能代表返回狀態,幾個可變引數,就構造幾維表。本題中,揹包所裝得物品的最大價值只與揹包容量和物品個數有關,所以dp表為二維:

3.根據base case填表:

if(n==0||m==0)
n\m01

2345

6789

1011

1213

1415

1617

1819200

0000

0000

0000

0000

0000

0102

0304

0504.分析乙個普遍位置的規律:

if((m>w[n])&&((knapsack(n-1, m-w[n], w, v)+v[n])>knapsack(n-1, m, w, v)))else
如果乙個位置的列(即揹包容量)>它的w[n](即物品質量),要知道這個位置的值,就得知道它(上一行,本列+w[n])+v[n] 元素的值和(上一行,本列) 元素的值,取其二者中最大值;

如果乙個位置的列(即揹包容量)<= 它的w[n](即物品質量),要知道這個位置的值,就得知道它(上一行,本列)元素的值。

補全dp表(略,見下圖):

動態規劃的**為:

// dp

private static int dpknapsack(int n, int m, int w, int v)

// for (int j = 0; j < m + 1; j++)

for (int i = 1; i < n + 1; i++) else

}} for (int x = 0; x < n + 1; x++)

system.out.println("");

} return dp[n][m];

}

動態規劃 01揹包

最優二叉查詢樹.cpp 定義控制台應用程式的入口點。01揹包問題。include stdafx.h include include define n 3 the number of real node define m 10 using namespace std int tmain int arg...

01揹包動態規劃

0 1揹包 問題描述 乙個旅行者有乙個最多能用 m公斤的揹包,現在有 n件物品,它們的重量 分別是w1,w2 wn,它們的價值分別為 c1,c2,cn.若每種物品只有一 件求旅行者能獲得最大總價值。輸入格式 w 第一行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 w第2.n 1 行...

0 1揹包(動態規劃)

題意 有n件物品和乙個容量為v的揹包。第i件物品的體積是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。基本思路 這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不放。用子問題定義狀態 即f i v 表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。則其狀態轉移方程...