1.问题引入
2.Bellman equation
分解为子问题,寻找子问题间的依赖关系。
第二行——肯定不选择物品i;
第三行——进行判断是否选择物品i。
伪代码:
3.java实现
/*
* 用动态规划解决背包问题
*/
public class BackBag {
public static int[][] getMaxValue(int[] values,int weights[],int capacity) {
int n = values.length;//物体数目
int opt[][] = new int[n+1][capacity+1];
for (int w = 0; w <= capacity; w++) {
opt[0][w] = 0;
}
//填表
for (int i = 1; i <= n; i++) {
int j = i-1;//第j个物品
for (int w = 0; w <= capacity; w++) {
if (weights[j]>w) {
opt[i][w] = opt[i-1][w];//肯定不选第i个物品
}else {
//进行判断是否要选择第i个物体
opt[i][w] = (opt[i-1][w-weights[j]]+values[j])>opt[i-1][w]?opt[i-1][w-weights[j]]+values[j]:opt[i-1][w];
}
}
}
// return opt[n][capacity];
return opt;
}
public static void main(String[] args) {
int[] values = {
18,22,28,1,6};
int[] weights = {
5,6,7,1,2};
// int[] values = {12,3,10,3,6};
// int[] weights = {5,4,7,2,6};
int capacity = 11;
int[][] max_value = getMaxValue(values,weights,capacity);
// System.out.println("动态规划解决背包问题获得的最大价值为:"+max_value);
for (int i = 0; i < max_value.length; i++) {
for (int j = 0; j < max_value[0].length; j++) {
System.out.print(max_value[i][j]+" ");
}
System.out.println();
}
}
}
4.总结
解决动态规划问题的关键在于寻找子问题间的依赖关系——即写出Bellmen方程。