背包问题

package com.experimental.dongtaiguihua;

/*
 *  01背包问题具体例子:假设现有容量10kg的背包,另外有3个物品,分别为a1,a2,a3。物品a1重量为3kg,价值为4;物品a2重量为4kg,价值为5;物品a3重量为5kg,价值为6。将哪些物品放入背包可使得背包中的总价值最大?

  这个问题有两种解法,动态规划和贪婪算法。本文仅涉及动态规划。

  先不套用动态规划的具体定义,试着想,碰见这种题目,怎么解决?

  首先想到的,一般是穷举法,一个一个地试,对于数目小的例子适用,如果容量增大,物品增多,这种方法就无用武之地了。

  其次,可以先把价值最大的物体放入,这已经是贪婪算法的雏形了。如果不添加某些特定条件,结果未必可行。

  最后,就是动态规划的思路了。先将原始问题一般化,欲求背包能够获得的总价值,即欲求前i个物体放入容量为m(kg)背包的最大价值c[i][m]——使用一个数组来存储最大价值,当m取10,i取3时,即原始问题了。而前i个物体放入容量为m(kg)的背包,又可以转化成前(i-1)个物体放入背包的问题。下面使用数学表达式描述它们两者之间的具体关系。
 */
public class Backpack {
	private final int capaticy = 10;
	private final int number = 3;
	//声明物品标记数组
	private int mark[];
	//声明物品的重量数组
	private int weight[];
	//声明物品的价值数组
	private int value[];
	//声明保存最大价值的数组
	private int [][] maxValue;
	public Backpack(){
		maxValue = new int [number + 1][capaticy + 1];
		mark = new int [number + 1];
		weight = new int [number + 1];
		value = new int [number + 1];
		//为每个物品赋初值
		weight[1] = 3; value[1] = 4;
		weight[2] = 4; value[2] = 5;
		weight[3] = 5; value[3] = 6;
		
		//当物品个数为0的时候,背包最大价值为0
		for(int i = 0; i <= capaticy; i++){
			maxValue[0][i] = 0;
		}
		//当背包容量为0的时候,背包最大价值为0
		for(int i = 0; i <= number; i++){
			maxValue[i][0] = 0;
		}
		
	}
	public void execute(){
		for(int i = 1; i <= number; i++){
			for(int j = 1; j <= capaticy; j++){
				if(j < weight[i]){
					maxValue[i][j] = maxValue[i-1][j];
				}else if((maxValue[i - 1][j -weight[i]] + value[i]) > maxValue[i-1][j]){
					maxValue[i][j] = maxValue[i - 1][j -weight[i]] + value[i];
				}else{
					maxValue[i][j] = maxValue[i-1][j];
				}
				
			}
		}
		int j = capaticy;
		for(int i = number; i >= 1; i--	){
			if(maxValue[i][j] > maxValue[i-1][j]){
				j -= weight[i];
				mark[i] = 1;
			}
		}
	}
	
	public void print(){
		for(int i = 1;i <= number; i++){
			for(int j = 1; j <= capaticy; j++){
				System.out.printf("%-4d", maxValue[i][j]);
			}
			System.out.println();
		}
		System.out.println("最大价值为:" + maxValue[number][capaticy]);
		System.out.print("装入背包的物品为:");
		for(int i = 1; i <= number; i++){
			if(mark[i] == 1){
				System.out.print(i + " ");
			}
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Backpack backpack = new Backpack();
		backpack.execute();
		backpack.print();
	}

}


你可能感兴趣的:(背包问题)