背包问题

问题与描述;

/**
* 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值