糾結了很久的01揹包問題,現在的感覺主要能寫出來狀態方程應該就好寫了。
設i爲當前放入物體的數量,j爲放入的物體的總重量,則函數f[i][j]爲總價值。
則函數f[i][j]的狀態方程爲
當放入第i個物體超重的時候 即weight[i-1]>j,f[i][j] =f[i-1][j];
反之f[i][j] = max{f[i-1][j] , f[i-1][j-weight[i]]+val[i]};
public static void main(String[] args) {
//揹包問題主要是指一個給定容量的揹包、若干具有一定價值和重量的物品,如何選擇物品放入揹包使物品的價值最大,01揹包,即每個物品最多放一個
int[] weight = {3,5,2,6,4}; //物品重量
int[] val = {4,4,3,5,3}; //物品價值
int m = 12; //揹包容量
int n = val.length; //物品個數
int[][] f = new int[n+1][m+1];
for (int i=0;i<f.length;i++){
f[i][0] = 0;
}
for (int i=0;i<f[0].length;i++){
f[0][i] = 0;
}
for (int i=1;i<f.length;i++){
for (int j = 1;j<f[0].length;j++){
if (weight[i-1]>j){//當放入第i個物體超重的時候
f[i][j] = f[i-1][j];
}
else {
if (f[i-1][j]<f[i-1][j-weight[i-1]]+val[i-1]){//放入第i個物體不超重並且價值更大
f[i][j] = f[i-1][j-weight[i-1]]+val[i-1];
}
else {
f[i][j] =f[i-1][j];
}
}
}
}
System.out.println(f[n][m]);
}