一个可装载重量为W的背包和N个物品,第i个物品重量wt[i],价值val[i] 求最多能装的价值
思想:动态规划,找出能装入背包的所有可能性,然后再找出最大价值的
1.每装一次一味着剩余能装的重量为:w - wt.get(n)
2.剩余选择物品的列表的开始则从i+1开始
3.找出最大价值的即可解出
/**
* description:0-1 背包问题
*/
public class Big {
static int N = 3;
static int W = 4;
static LinkedList<LinkedList<Integer>> integers = new LinkedList<>();
public static void main(String[] args) {
// 装载量为W的 N个物品 第i个物品重量 wt[i] 价值val[i] 求最大装入价值
List<Integer> wt = Arrays.asList(2, 1, 3);
List<Integer> val = Arrays.asList(4, 2, 3);
LinkedList<Integer> list = new LinkedList<>();
choose(W, 0, wt, list);
System.out.println(Big.integers);
int max = 0;
for (LinkedList<Integer> integer : Big.integers) {
int sum = integer.stream().mapToInt(o -> val.get(o)).sum();
if (sum > max) {
max = sum;
}
}
System.out.println(max);
}
public static void choose(int w, int n, List<Integer> wt, LinkedList<Integer> tmp) {
// 如果当前重量减去选择重量小于0则退出
if (n >= N || w - wt.get(n) < 0) {
integers.add(new LinkedList<>(tmp));
return;
}
/**
* 剩余重量
*/
for (int i = n; i < N; i++) {
if (w - wt.get(i) < 0) {
continue;
}
tmp.add(i);
choose(w - wt.get(i), i + 1, wt, tmp);
tmp.removeLast();
}
}
}