问题与描述;
/**
* 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