You cannot divide item into small pieces and the total size of items you choose should smaller or equal to m.
public int backPackII(int m, int[] A, int V[]) {
// write your code here
int[][] d = new int[A.length+1][m+1];
for (int i = 0; i <= A.length; i++) {
for (int j = 0; j <= m; j++) {
if (i == 0 || j == 0) {
d[i][j] = 0;
} else {
if (A[i-1] <= j) {
d[i][j] = Math.max(d[i-1][j], d[i-1][j-A[i-1]] + V[i-1]);
} else {
d[i][j] = d[i-1][j];
}
}
}
}
return d[A.length][m];
}
Use one dimension array:
public int backPackII(int m, int[] A, int V[]) {
int[] d = new int[m+1];
for (int i = 1; i <= A.length; i++) {
for (int j = m; j >= 0; j--) {
if (j == 0) {
d[j] = 0;
} else {
if (A[i-1] <= j) {
d[j] = Math.max(d[j-A[i-1]]+V[i-1], d[j]);
}
}
}
}
return d[m];
}
O(nm)