測試資料:
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的揹包可以獲得的最大價值。則其狀態轉移方程...