Java版
class Scratch {
public static void main(String[] args) {
int price[] = {5, 8, 28, 9, 6, 18, 21, 19, 19, 23, 10, 9, 34, 26, 38, 9};
int size[] = {6, 3, 19, 20, 15, 12, 10, 22, 8, 18, 14, 13, 18, 19, 33, 10};
int packSize = 100; //背包容量
Pack myPack = new Pack();
int optimalSolution = myPack.pack01(price, size, packSize);
System.out.println("最大价值总和为" + optimalSolution);
}
}
class Pack{
public int pack01(int price[], int size[], int packSize){
int[][] dp = new int[price.length][packSize + 1];
for (int i = 0; i < packSize + 1; i++) {
//初始化dp数组,当只有第一个物品的情况
if(i >= size[0])
dp[0][i] = price[0];
}
//循环数组,先遍历物品,再遍历背包
for (int i = 1; i < price.length; i++){
for (int j = 1; j < 101; j++){
if(size[i] > j){
//当前背包容量j装不下物品i时,最大价值继承dp[i-1][j]
dp[i][j] = dp[i-1][j];
}else{
//当前背包容量可以装的下物品i时,可选
//1.将物品i装进背包,然后剩下空间装其他价值之和最大的物品
//2.不装物品i,装除物品i其他价值总和最大的物品
//比较两种情况最大价值总和,选最大值
if(dp[i-1][j] > dp[i-1][j-size[i]] + price[i]){
//当第二种情况价值总和大于第一种
dp[i][j] = dp[i-1][j];
}else{
//当第一种情况价值总和大于第二种
dp[i][j] = dp[i-1][j-size[i]] + price[i];
}
}
}
}
//遍历dp矩阵
for (int i = 0; i < dp.length; i++){
for (int j = 0; j < dp[i].length; j++){
System.out.print(dp[i][j] + "\t");
}
System.out.println();
}
//寻找装了哪些物品
System.out.print("装了以下物品,(从编号0开始)");
int i = price.length - 1, j = packSize;
for(; i > 0 && j > 0;){
if(dp[i][j] == dp[i-1][j]){
i--;
}else{
System.out.print(i + "\t");
j -= size[i];
i--;
}
}
if(dp[i][j] != 0){
System.out.print(i + "\t");
}
System.out.println();
return dp[price.length - 1][packSize];
}
}