前言
第三次看动态规划了,总是能够稍微的理解了,但是下次想用的时候就用不出来了...记录一下,时间问题,只有代码没有解释.
import java.util.Arrays;
import java.util.Random;
/**
* 0 - 1 背包问题
*/
public class BagProblem {
public static void main(String[] args){
// 总计n件物品
int n = 10;
// m[i]表示第i件物品的重量
int[] m = new int[n];
// v[i]表示第i件物品的价值
int[] v = new int[n];
// 背包的承重量
int capacity = 80;
Random random = new Random();
for (int i = 0; i < n; i++) {
int data = random.nextInt();
data = data < 0 ? data * -1 : data;
m[i] = data % 22 + 1;
v[i] = data % 23;
}
System.out.println(Arrays.toString(m));
System.out.println(Arrays.toString(v));
solve(n, m, v, capacity);
}
private static void solve(int n, int[] m, int[] v, int capacity){
// 因为数组是从0开始的,所以列的size为capacity + 1
// 同理,行也如此
// 这样dp[i][j], 就表示j 大小下, 前i个物品装入的最大价值
// 另外,还有个好处就是不需要判断 i-1是否小于0了,当然,这都不重要
int[][] dp = new int[n + 1][capacity + 1];
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < capacity + 1; j++) {
if (j < m[i -1]){
// 如果整个包只装它一个都装不下
dp[i][j] = dp[i - 1][j];
} else {
// 如果装进去的话得到的价值
int takeIn = dp[i - 1][j - m[i - 1]] + v[i - 1];
// 如果不装的话价值
int notIn = dp[i - 1][j];
dp[i][j] = takeIn > notIn ? takeIn : notIn;
}
}
}
System.out.println("矩阵:");
for (int[] ints : dp) {
System.out.println(Arrays.toString(ints));
}
}
}