diff --git a/src/dataANDcalc/java/algorithm/Backpack.java b/src/dataANDcalc/java/algorithm/Backpack.java new file mode 100644 index 0000000..bb7c343 --- /dev/null +++ b/src/dataANDcalc/java/algorithm/Backpack.java @@ -0,0 +1,69 @@ +package algorithm; + +import java.util.HashMap; +import java.util.Map; + +/** + * 背包问题-动态规划算法 + */ +public class Backpack { + + private int[] weight; + + private int[] value; + + private int[][] backpack; + + private int capacity; + + private int goodsNum; + + private Map goodsMap; + + public Backpack(int capacity) { + weight = new int[4]; + value = new int[4]; + goodsNum = 1; + backpack = new int[4][capacity+1]; + goodsMap = new HashMap<>(); + this.capacity = capacity; + } + + private void addPack(String name, int weight, int value){ + goodsMap.put(goodsNum, name); + this.weight[goodsNum] = weight; + this.value[goodsNum] = value; + for (int j = 1; j <= capacity; j++) { + if (this.weight[goodsNum] > j){ + // 如果当前物品超重,则取前一个物品对应当前容量的价值 + backpack[goodsNum][j] = backpack[goodsNum-1][j]; + } else { + // 如果当前物品没有超重,则取前一个物品对应当前容量的价值 和 当前物品价值加上减去当前物品重量后的前面物品对应重量的价值之和 的最大值 + backpack[goodsNum][j] = Math.max(backpack[goodsNum - 1][j],backpack[goodsNum - 1][j - this.weight[goodsNum]] + this.value[goodsNum]); + } + } + goodsNum ++; + } + + private int getMaxValue(){ + return backpack[goodsNum-1][capacity]; + } + + private void showPack(){ + for (int i = 0; i < goodsNum; i++) { + for (int j = 0; j < capacity+1; j++) { + System.out.print(backpack[i][j] + " "); + } + System.out.println(); + } + } + + public static void main(String[] args) { + Backpack backpack = new Backpack(4); + backpack.addPack("吉他",1,1500); + backpack.addPack("音响",4,3000); + backpack.addPack("电脑",3,2000); + backpack.showPack(); + System.out.println("背包的最大价值为:" + backpack.getMaxValue()); + } +}