问题和思路
算法实现
import java.util.Scanner;
public class Main
{
public static void printArr(int[][] arr)
{
for(int i=0;i<arr.length;i++)
{
for(int j=0;j<arr[0].length;j++)
{
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
public static void main(String[] args)
{
//物品的重量
int[] w = {0, 1, 4, 3};
//物品的价值
int[] val = {0, 1500, 3000, 2000};
//背包的容量
int m = 4;
// 物品的个数
int n = 3;
// v[i][j]表示前i个物品中,能够装入容量为j的背包中的最大价值
int[][] v = new int[n+1][m+1];
// 此二维数组记录商品情况
int[][] path = new int[n+1][m+1];
//初始化第一行和第一列,都为0
for(int i=0; i < n;i++)
{
//第一列
v[i][0] = 0;
}
for(int j=0;j<m;j++)
{
//第一行
v[0][j] = 0;
}
printArr(v);
System.out.println();
//根据公式进行动态规划
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(w[i] > j)
{
v[i][j] = v[i-1][j];
}
else if(w[i]<=j)
{
// v[i][j] = Math.max(v[i-1][j],val[i] + v[i-1][j-w[i]]);
// 记录商品到背包中的情况
if(v[i-1][j] < val[i] + v[i-1][j-w[i]])
{
v[i][j] = val[i] + v[i-1][j-w[i]];
path[i][j] = 1;
}
else
{
v[i][j] = v[i-1][j];
}
}
}
}
printArr(v);
System.out.println();
printArr(path);
int i = path.length-1;
int j = path[0].length-1;
while(i>0 && j>0)
{
if(path[i][j] == 1)
{
System.out.println("第"+i+"件商品放入背包");
j-=w[i];
}
i--;
}
}
}