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();
}
}
简单背包问题
最新推荐文章于 2022-08-16 11:13:28 发布