不廢話,直接上**。
/**
* 動態規劃,揹包問題。
* 輸入為:int n: 物品的種類數。 int[n] weight: 各件物品的重量。 int[n] value: 各種物品的價值。
* int w: 揹包最大的裝載重量。
* 輸出:v[n][b]的值, 最大的裝載價值。 x[n] 各類物品的裝載數量。
* *@author huangyongye
* */
public
class
bag
else
else }}
}
int result = labels(i, weight, b);
/* 3.構造解,輸出選擇結果 */
for(int i: result)
return v[n][b];
}/**
* 返回裝入的物品數量,構造解
*@param i
*@return
*/public
int labels(int i, int weight, int b)
int y = b; // 總重量
while(i[n][y] != 0)
}return result;
}public
static
void
main(string args) ;
int value = ;
int b = 10;
bag bt = new bag();
int result = bt.maxvalue(weight, value, b);
system.out.println("\nmax value is "+ result);
}}
和普通揹包問題相比,0-1揹包問題多了乙個限制, 就是某類物品只有乙個,所以只能放置一遍。所以只需要對遞推方程做簡單修改就沒問題了。具體說明見**。
/**
* 動態規劃:0-1揹包問題
* 輸入:int[n] weight 物品的重量
* int[n] value 物品的價值
* int b 物品最大的載重量
* 輸出:boolean[n] opt 選擇或者不選擇該物品。
* * 思路:和普通的揹包問題相比,這裡的每類物品只有一件。所以遞推函式需要做相應的調整。
* v[i][j] = max
* 所以揹包問題和0-1揹包問題只有一點點區別,就是遞推方程的第二項的下標是i-1而不是i.
* *@author huangyongye
* */
public
class
bag01
else
if(v[i-1][j] > v[i-1][j-weight[i-1]] + value[i-1])
else }}
maxvalue = v[n][b];
// 記錄物品是否被選中
boolean opt = new
boolean[n];
opt = labels(i, weight, b);
/* 輸出選擇結果 */
for(boolean i: opt)
return maxvalue;
}/**
* 記錄物品選擇的結果
*@param i
*@param weight
*@param b
*@return
*/private
static
boolean labels(int i, int weight, int b)
int y = b;
/* 2.回退找解 */
while(i[n][y] != 0)
return opt;
}public
static
void
main(string args) ;
int value = ;
int b = 13;
int maxvalue = maxv(weight, value, b);
system.out.println("\nthe maxvalue is " + maxvalue);
}}
上面的兩個問題都很容易分析。
第一部分:分割子問題中使用兩重迴圈,內部運算都是常數時間複雜度,所以總的時間複雜度是o(n2)。
第二部分:構造解,每次回退至少一步求解乙個裝入的物品,所以複雜度為o(b),算上初始化的時間複雜度為o(n)。
所以主要時間複雜度為第一部分,即o(n2)。而空間複雜度,主要是儲存了備忘錄,二維陣列v和i,複雜度為o(nb).
動態規劃 揹包問題
給定n個物品,重量是,價值是,包的容量 承重 是w 問,放入哪些物品能使得包內價值最大 1 需要將問題轉化為子問題,通過遞迴實現,且子問題必然與父問題存在關聯 2 定義v i,j 表示為,當item取自前i個items且揹包capacity j 時,揹包問題的最優解,也即最高的價值。3 從前i個it...
動態規劃 揹包問題
1 開心的金明 問題描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n 元。於是,他把每...
動態規劃 揹包問題
define crt secure no warnings include include include include head.h using namespace std const int maxn 100 int dp maxn maxn int w maxn int v maxn voi...