publicintsolution(int [] m, int[] w, int[] v, int c) { return cal(m, w, v, w.length, c); }
publicintcal(int[] m int[] w, int[] v, int i, int j) { if (i < 0 || j <= 0) { return0; } intresult=0; if (w[i] > j) { result = cal(w, v, i - 1, j); } elseif (i < 0) { result = v[i] * Math.floor(j / w[i]); } else { for (intk=0; k <= m[i] && k * w[i] < j; k++) { inttmp= cal(w, v, i - 1, j - k * w[i]) + k * v[i]; result = Math.max(result, tmp); } } return result; }
动态规划
递归
publicintsolution(int[] m, int[] w, int[] v, int c) { int[][] result = newint[][]; return cal(m, w, v, result, w.length, c); }
publicintcal(int[] m, int[] w, int[] v, int[][] result, int i, int j) { if (result[i][j] != null) { return result[i][j]; } if (i < 0 || j <= 0) { return0; } else { if (w[i] > j) { result[i][j] = cal(w, v, result, i - 1, j); } else { for (intk=0; k <= m[i] && k * w[i] <= j; k++) { inttmp= cal(w, v, result, i, j - k * w[i]); result[i][j] = Math.max(result[i][j], tmp); } } } }
迭代
publicintsolution(int[] m, int[] w, int[] v, int c) { // 初始化为 r = 0 / r[i][0] = 0 int[][] result = newint[][]; for (inti=1; i < w.length; i++) { for (intj=0; j <= c; j++) { for (intk=0; k <= m[i] && k * w[i] <= j; k++) { result[i][j] = Math.max(result[i][j], result[i - 1][j - k * w[i]] + k * v[i]); } } } return result[w.length][c]; }
空间优化
publicintsolution(int w[], int v[], int c) { // 初始化为 r = 0 / r[0] = 0 int[] result = newint[]; for (inti=0; i < w.length; i++) { if (m[i] * w[i] >= c) { for (intj= w[i]; j <= c; j++) { result[j] = Math.max(result[j], result[j - w[i]] + v[i]); } } else { for (intj= c; j >= w[i]; j--) { for (intk=1; k <= m[i] && k * w[i] <= j) { result[j] = Math.max(result[j], result[j - w[i] * k] + v[i] * k); } } } } return result[c]; }