1.問題の紹介
2.ベルマン方程式
サブ問題に分解し、サブ問題間の依存関係を探します。
2行目-絶対にアイテムiを選択しない、
3行目-アイテム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.まとめ
動的計画問題を解くための鍵は、サブ問題間の依存関係を見つけること、つまり、ベルメン方程式を書くことです。