import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
public class Knapsack
{
public Knapsack(int capacity, int quantity)
{
this.quantity = quantity;
this.capacity = capacity;
this.v = new int[quantity];
this.w = new int[quantity];
this.fValue = new int[quantity + 1][capacity + 1];
}
public int[] getV()
{
return v;
}
public void setV(int[] v)
{
this.v = v;
}
public int[] getW()
{
return w;
}
public void setW(int[] w)
{
this.w = w;
}
public int[][] getfValue()
{
return fValue;
}
public void setfValue(int[][] fValue)
{
this.fValue = fValue;
}
public static void main(String[] args)
{
Scanner scanner = null;
PrintWriter writer = null;
try
{
scanner = new Scanner(new File("Knapsack.txt"));
writer = new PrintWriter(new File("KnapsackResult.txt"));
int capacity = scanner.nextInt();
int quantity = scanner.nextInt();
Knapsack kna = new Knapsack(capacity, quantity);// 初始化背包
int[] v = kna.getV();
int[] w = kna.getW();
int[][] fvalue = kna.getfValue();
int i = 1;
for (i = 1; i <= quantity; i++)
{// 初始化物品价值数组和重量数组
w[i - 1] = scanner.nextInt();
v[i - 1] = scanner.nextInt();
}
for (i = 1; i <= quantity; i++)
{
fvalue[i][0] = 0;
}
for (i = 1; i <= capacity; i++)
{
fvalue[0][i] = 0;
}
for (i = 1; i <= quantity; i++)
{
for (int j = 1; j <= capacity; j++)
{
if (j < w[i - 1])
{
fvalue[i][j] = fvalue[i - 1][j];
}
else
{
fvalue[i][j] = Math.max(fvalue[i - 1][j],
fvalue[i - 1][j - w[i - 1]] + v[i - 1]);
}
}
}
System.out.println("背包中物品的最大价值是:" + fvalue[quantity][capacity]);
kna.traceBack(v, w, fvalue, capacity, quantity);
System.out.println("构造的二维表格输出结果:");
for (i = 1; i <= quantity; i++)
{// 输出二维数组到文本文件KnapsackResult.txt中
for (int j = 1; j <= capacity; j++)
{
System.out.print(fvalue[i][j] + " ");
writer.print(fvalue[i][j] + " ");
}
System.out.println();
writer.println();
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if (scanner != null)
scanner.close();
if (writer != null)
writer.close();
}
}
public void traceBack(int[] v, int[] w, int[][] fvalue, int capacity, int quantity)
{
int wupinNo[] = new int[quantity + 1];
int j = capacity;
for (int i = quantity; i > 0; i--)
{
if (fvalue[i][j] > fvalue[i - 1][j])
{
wupinNo[i] = 1;
j -= w[i - 1];
if (j < 0)
{
break;
}
}
}
int sumWeight = 0;// 记录背包的总重量
System.out.println("背包中物品的编号是:");
for (int i = 1; i <= quantity; i++)
{
if (wupinNo[i] == 1)
{
System.out.print(i + " ");
sumWeight += w[i - 1];
}
}
System.out.println();
System.out.println("背包的总重量是:" + sumWeight);
}
//Data member
private int[] v; // 存储物品的价值
private int[] w; // 存储物品的重量
private int capacity; // 背包容量
private int quantity; // 物品数量
private int fValue[][]; // fValue[i][j]存储前i个物品的重量为j的最大价值
}
运行结果: