01背包与无限背包

image.png

  1. public class KnapsackProblem {
  2. public static void main(String[] args) {
  3. //动态规划可以用填表法
  4. //每个物品的重量
  5. int[] w = {1, 4, 3};
  6. //每个物品的价值
  7. int[] v = {1500, 3000, 2000};
  8. int m = w.length;
  9. //背包的容量
  10. int bag = 4;
  11. //定义容量和价值的二维数组,行=物品数量+1,列=背包容量+1
  12. int[][] val = new int[m + 1][bag + 1];
  13. // val[0][j]、val[i][0]默认都是1
  14. // 给数组赋值
  15. for (int i = 1; i < m + 1; i++) {
  16. for (int j = 1; j < bag + 1; j++) {
  17. if (j < w[i - 1]) {
  18. val[i][j] = val[i - 1][j];
  19. } else {
  20. //注意这里 val[i][j-w[i-1]], 这说明当 j>=w[i-1],即背包容量大于当前这个物体重量的时候,
  21. // 此时背包最大价值=(在背包容量=当前背包容量减去这个物体的重量 的时候,
  22. //并且可以放入这个物体的时候所能承载的最大价值)
  23. //这样说有点绕口,还没有代码好理解。
  24. //总之,就是在容量为 j-w[i-1]的时候,val[i][]可以装入当前这个物体。
  25. //val[i-1][]不能装入当前物体
  26. //一个是01背包,一个是无线背包
  27. val[i][j] = Math.max(val[i - 1][j], v[i - 1] + val[i-1][j - w[i - 1]]);
  28. }
  29. }
  30. }
  31. for (int i = 0; i < val.length; i++) {
  32. for (int j = 0; j < val[0].length; j++) {
  33. System.out.print(val[i][j] + "\t");
  34. }
  35. System.out.println();
  36. }
  37. }
  38. }

image.png