package com.knapsack.problem;
public class BackPack {
//主函數
public static void main(String[] args) {
int m = 10;//揹包最大容量爲10
int n = 3;//商品個數爲3
int w[] = {3, 4, 5};//商品的重量
int p[] = {4, 5, 6};//商品的價值
int c[][] = BackPack_Solution(m, n, w, p);//儲存運算過程的數組
for (int i = 0; i <=n; i++) {
for (int j = 0; j <=m; j++) {
System.out.print(c[i][j]+"\t");
if(j==m){
System.out.println();
}
}
}
//printPack(c, w, m, n);
}
/**
* @param m 表示揹包的最大容量
* @param n 表示商品個數
* @param w 表示商品重量數組
* @param p 表示商品價值數組
* @param c[i][m] 前i個物體放入容量爲m的揹包的最大價值
* @param c[i-1][m] 前i-1個物體放入容量爲m的揹包的最大價值
* @param c[i-1][m-w[i]] 前i-1個物體放入容量爲m-w[i]的揹包的最大價值
*/
public static int[][] BackPack_Solution(int m, int n, int[] w, int[] p) {
//c[i][]表示前i件物品恰放入一個重量爲m的揹包可以獲得的最大價值
int c[][] = new int[n + 1][m + 1];//創建數組
for (int i = 0; i < n + 1; i++) {
for (int j = 0; j < m + 1; j++) {
if(i == 0 || j == 0)
c[i][j] = 0;//將放入物體爲空 和 揹包容量爲0的情況 價值置0
else if(w[i - 1] <= j){//揹包容量足以放下 物品 w[i-1]時, 判斷放入數據能否使揹包價值增加
if (c[i - 1][j] < (c[i - 1][j - w[i - 1]] + p[i - 1]))
c[i][j] = c[i - 1][j - w[i - 1]] + p[i - 1];//能則存入
} else
c[i][j] = c[i - 1][j];//否則不放入
}
//當物品爲i件重量爲j時,如果第i件的重量(w[i-1])小於重量j時,c[i][j]爲下列兩種情況之一:
//(1)物品i不放入揹包中,所以c[i][j]爲c[i-1][j]的值
//(2)物品i放入揹包中,則揹包剩餘重量爲j-w[i-1],所以c[i][j]爲c[i-1][j-w[i-1]]的值加上當前物品i的價值
}
return c;
}
}
動態規劃求解揹包問題(JAVA實現)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.