Backpack
Given n items with size Ai, an integer m denotes the size of a backpack. How full you can fill this backpack?
这一个题不是背包9讲里面的例子,但是是01完全背包的变形,只考虑体积和背包体积,不考虑价值.后面一个是空间没有优化的做法,但是因为可以空间优化,至于i-1的元素有关,然后又是每个元素只能用一次,所以要倒叙(方法一)
方法一:空间优化
public int backPack(int m, int[] A) {
boolean f[] = new boolean[m + 1];
for (int j = 0; j <= m; j++) {
f[j] = false;
}
f[0] = true;
for (int i = 1; i <= A.length; i++) {
for (int j = m; j >= 0; j--) {
if (j >= A[i-1] && f[j - A[i-1]]) {
f[j] = true;
}
} // for j
} // for i
for (int i = m; i >= 0; i--) {
if (f[i]) {
return i;
}
}
return 0;
}
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;
}
}
f[0][0] = true;
for (int i = 1; i <= A.length; i++) {
for (int j = 0; 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;
}