題目描述就不用說了,這裏直接給上數據:
揹包的容量 : 20
物品的質量:2 3 4 5 9
物品的價錢:3 4 5 8 10
其實這種問題,簡單了就是每走一步都會有選和不選的兩種情況,而這兩種情況,必須要選擇其中最好的情況:
使用B(K,W): k 個商品 ; W 剩下的空間,來表示當前的狀態。
可以將選擇樹和狀態方程相對應:
對於最終的數組都出出現以下情況:
所以對於揹包問題有如下代碼:
package com.lanqiao.study;
/**
* 算法描述
* 揹包重量:2 3 4 5 9
* 價值: 3 4 5 8 10
* 揹包容量: 20
* B(K,W): k 個商品 ; W 剩下的空間
*/
public class 揹包問題 {
public static void main(String[] args) {
//對於每一種的商品都有偷和不偷的兩種情況
//偷 : 揹包的重量會減少相應的重量,不偷,會將物品減一,商品的數量會減少
//數組的行代表的是K個商品,列代表的是
int[][] dp = new int[6][21];
int[] p = {0, 3, 4, 5, 10, 8};
int[] v = {0, 2, 3, 4, 9, 5};
for (int i = 1; i < 6; i++) {
for (int j = 1; j < 21; j++) {
//中止條件時,當前的重量大於揹包的容量,就只是減去數量,但是不加質量
if (v[i] > j) {
dp[i][j] = dp[i - 1][j];
} else {
//選
int a = dp[i - 1][j - v[i]] + p[i];
//不選
int b = dp[i - 1][j];
dp[i][j] = Math.max(a, b);
}
}
}
System.out.println(dp[5][20]);
}
}