第7周作业--背包问题

本文详细阐述了背包问题的解决方法,通过初始化物品价值数组和重量数组,使用动态规划算法计算背包最大价值,并输出结果至文本文件。
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的最大价值
}


运行结果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值