给出n个物品的体积A[i]和其价值V[i],将他们装入一个大小为m的背包,最多能装入的总价值有多大?
n个物品,背包为m,体积a[1..n],价值v[1..n]
state: f[i][j]表示前i个物品中,取出“若干”物品
后,体积“正好”为j的最大价值。
function: f[i][j] = max{f[i-1][j], f[i-1][j - a[i]] +
v[i]}
intialize: f[X][0] = 0, f[0][1..m] = -oo
answer: f[n][1..m]中最大值
public int backPack(int m, int[] A) {
boolean f[][] = new boolean[A.length + 1][m + 1];
for (int i = 0; i <= A.length; i++) {
for (int j = 0; j <= m; j++) {
f[i][j] = false;
}
}
for(int j = 1; j <= m; j++){
f[0][j] = false;
}
for(int i = 0; i <= A.length; i++){
f[i][0] = true;
}
for (int i = 1; i <= A.length; i++) {
for (int j = 1; j <= m; j++) {
f[i][j] = f[i - 1][j];
if (j >= A[i-1] && f[i-1][j - A[i-1]]) {
f[i][j] = true;
}
} // for j
} // for i
for (int i = m; i >= 0; i--) {
if (f[A.length][i]) {
return i;
}
}
return 0;
}