package com.knapsack.problem;
public class BackPack {
//主函數
public static void main(String[] args) {
int m = ;//背包最大容量為10
int n = ;//商品個數為3
int w[] = {, , };//商品的重量
int p[] = {, , };//商品的價值
int c[][] = BackPack_Solution(m, n, w, p);//儲存運算過程的數組
for (int i = ; i <=n; i++) {
for (int j = ; 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 + ][m + ];//建立數組
for (int i = ; i < n + ; i++) {
for (int j = ; j < m + ; j++) {
if(i == || j == )
c[i][j] = ;//将放入物體為空 和 背包容量為0的情況 價值置0
else if(w[i - ] <= j){//背包容量足以放下 物品 w[i-1]時, 判斷放入資料能否使背包價值增加
if (c[i - ][j] < (c[i - ][j - w[i - ]] + p[i - ]))
c[i][j] = c[i - ][j - w[i - ]] + p[i - ];//能則存入
} else
c[i][j] = c[i - ][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;
}
}