简单揹包问题

package 算法;

import java.util.Scanner;

/**
 * 揹包问题:
 *     给定一个容量为capacity的揹包,给定一个数据项数组Item [] items,
 *     数组里面的每个数据项只能放入揹包中一次,数组里面的数据项包含数据的
 *     大小和价值,求容量为capacity的揹包所能存放数据项的价值最大的解。
 */
//数据项类
class Item {
	public int size;
	public int value;
	public Item(int size,int value){
		this.size = size;
		this.value = value;
	}
}

public class Knapsack {
	private int  capacity;         //揹包的容量
	private Item[] items ;          //数据项数组
	private int numItem;         //数据想的个数
	private int[][] maxValue;        //最大值数组
	
	public Knapsack(int capacity,Item[] items){
		this.capacity = capacity;
		this.items = items;
		this.numItem = items.length;
		maxValue = new  int [this.numItem+1][this.capacity+1];
		
		
	}
	
	//构造最大数组
	public void makeMaxValue(){
		
	
		int testMax;
		for(int i =1; i <= numItem;i++){
			for(int j = 1; j <= capacity ;j++){
				if(j >= items[i-1].size){
					testMax =items[i-1].value+ maxValue[i-1][j-items[i-1].size];
					if(testMax >= maxValue[i-1][j]){
						maxValue[i][j] = testMax;
					}
					else{
						maxValue[i][j] = maxValue[i-1][j];
					}
				}
				else{
					maxValue[i][j] = maxValue[i-1][j];
				}
				
			}//end for(j)
		}//end for (i)
	}
	//推断揹包中的数据项,所包含的数据项
	public void displayMaxValue(){
		
		
		makeMaxValue();
		showMaxValue();
		int lessCapacity = capacity;
		int lessValue = maxValue[numItem][capacity] ;
		//Item it;
		int itemSize;
		int itemValue;
		System.out.println("揹包的容量:" +capacity+"揹包里面东西的价值:"+maxValue[numItem][capacity]);
		System.out.println("所包含的元素如下:");
		for(int i = numItem ; i > 0 ; i--){
			System.err.println(i);
			itemSize = items[i-1].size;
			itemValue = items[i-1].value;
			
			if(lessValue >= maxValue[i][itemSize] && maxValue[i][itemSize] >= maxValue[i-1][itemSize]){
				System.out.println("大小  "+itemSize+"价值  "+itemValue);
				lessValue = lessValue - itemValue;
				lessCapacity = lessCapacity -  itemSize;
			}
		}
		//判断有没有剩余的空间
		if(lessCapacity > 0){
			System.out.println("剩余的空间大小为:"+lessCapacity);
		}
		else{
			System.out.println("刚好占满空间。");
		}
	}
	
	//输出最大元素的数组
	private void  showMaxValue(){
		for(int i =1 ; i <= numItem; i++){
			for(int j = 1 ; j <= capacity ; j++){
				System.out.print(maxValue[i][j]+"   ");
			}
			System.out.println();
		}
	}

	//main用于测试算法
	public static void main(String[] args) {
		
		//数据想数组
		Item [] items = {new Item(2,1),new Item(3,4),new Item(4,3),
			                   	new Item(5,6),new Item(6,8)};
		
		int capacity = 0;
		Scanner sc = new Scanner(System.in);
		
		try{
			System.out.println("请输入揹包的大小:");
			capacity = sc.nextInt();
		}catch (Exception e){
			e.printStackTrace();
		}
		
		Knapsack kna = new Knapsack(capacity, items);

		kna.displayMaxValue();
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章