背包问题

来源:互联网 发布:javascript对象是什么 编辑:程序博客网 时间:2024/06/08 02:36

问题与描述;

/**
* Author:林万新 lwx
* Date: 2017/10/27
* Time: 17:41
* 问题描述;
* 1个背包最多负重8KG,希望放入价值最大化
* 编号 水果 重量 价值
* 0 李子 4KG 4500
* 1 苹果 5KG 5700
* 2 橘子 2KG 2250
* 3 草莓 1KG 4500
* 4 甜瓜 6KG 4500
*
* 解法:
* 动态规划:从空集合开始,
* 每加入1个元素就求出该阶段最优解,
* 直到所有元素加入,最后得到的就是最佳解
*/
public class Package {
//内部水果类
class Fruit{
private String name;
private int size;//水果的重量
private int price;

    public Fruit(String name, int size, int price) {        this.name = name;        this.size = size;        this.price = price;    }    public String getName() {        return name;    }    public int getSize() {        return size;    }    public int getPrice() {        return price;    }}//方法public void package1(){    final  int MAX = 8;    int [] item = new int[MAX+1];//表示最后一个放到背包的水果    int [] value=new int[MAX+1];//这个才是重点:表示目前最佳解所得的总价    Fruit[] fruits =  {            new Fruit("李子",4,4500),            new Fruit("苹果",5,5700),            new Fruit("橘子",2,2250),            new Fruit("草莓",1,1100),            new Fruit("甜瓜",6,6700),    };    //关键方法    for(int i = 0;i<fruits.length;i++){        for(int s = fruits[i].getSize();s<= MAX;s++){            int p = s - fruits[i].getSize();            int newvalue = value[p]+ fruits[i].getPrice();//关键思想            if(newvalue > value[s]){                value[s]  = newvalue;                item[s] = i;            }        }    }    System.out.println("物品\t价格");    for(int i = MAX;i>=1;i = i-fruits[item[i]].getSize()){        System.out.println(fruits[item[i]].getName() + "\t"        + fruits[item[i]].getPrice());    }    System.out.println("合计\t" + value[MAX]);}public static  void main(String [] args){    new Package().package1();}

}

运行结果;
物品 价格
草莓 1100
橘子 2250
苹果 5700
合计 9050

原创粉丝点击