背包问题
/**
* 背包问题:
*
* 有N件物品和一个容量为V的背包。第i件物品的价值是v[i],重量是w[i]。
* 求解将哪些物品装入背包可使价值总和最大。
*
*
* 重新定义问题:
*
*
* 状态转移方程:
* 状态:设d(i, j)为前i件物品转到剩余体积为j的背包的最大价值
* 方程:d(i, j) = max{d(i-1, j), d(i-1, j-w[i])+v[i]}, j-w[i]>=0
*/
代码
/**
* 在这段代码里面,所有数组的第一位,也就是int[0]是无效的
* @param args
*/
public static void main(String[] args){
int n = 5;//物件数量
int v = 10;//背包空间
int[] value = {0, 8, 10, 4, 5, 5};
int[] weight = {0, 6, 4, 2, 4, 3};
int[][] d = new int[n+1][v+1];//用于保存所求的最大价值
//遍历每一个物品
for (int i = 1; i <= n; i++) {
//这个物品在背包空间为1到V(最大)情况下的最大价值
for (int j = 1; j <= v; j++) {
//如果放得下
if (j >= weight[i]) {
int a = d[i-1][j];//不放的价值
int b = d[i-1][j - weight[i]] + value[i];//放的价值
d[i][j] = a > b ? a : b;
}else {
//放不下
d[i][j] = d[i-1][j];
}
}
}
System.out.println(d[n][v]);
}