题目描述
假设目前共有a,b,c,d ,e这5件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包, 怎么装背包,可以才能带走最多的财富。
01背包问题是动态规划算法很经典的问题
状态转移方程: f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] }
f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。
Pi表示第i件物品的价值。
决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中吗 ?
这张表是至底向上,从左到右生成的,横坐标是物品种类有哪些,纵坐标代表背包容量大小,例如: (c, 5) 表示目前物品有c\d\e三种且背包容量为5能带走的最大价值。你可以根据上面的状态转移公式对应这张表,如果你看懂了那么你就理解了01背包问题的动态规划算法了!
代码
package LeeCode;
public class get01PackageAnswer {
public static void testPackage() {
Package[] pg = {new Package("e", 4, 6),
new Package("d", 5, 4),
new Package("c", 6, 5),
new Package("b", 2, 3),
new Package("a", 2, 6)};
int[][] state = new int[pg.length][11];
int newValue = 0;
for (int i = 0; i < state.length; i++) {
for (int j = 0; j < state[i].length; j++) {
if (i == 0) {
if (j >= pg[i].getWeight()) {
state[i][j] = pg[i].getValue();
}
} else {
state[i][j] = state[i - 1][j];
if (j < pg[i].getWeight()) {
continue;
}
newValue = state[i - 1][j - pg[i].getWeight()] + pg[i].getValue();
state[i][j] = Math.max(state[i - 1][j], newValue);
}
}
}
}
public static void main(String[] args) {
testPackage();
}
}
class Package {
private String name;
private int weight;
private int value;
public Package(String name, int weight, int value) {
this.name = name;
this.weight = weight;
this.value = value;
}
public String getName() {
return name;
}
public int getWeight() {
return weight;
}
public int getValue() {
return value;
}
}