与0-1 背包问题类似,所不同的是在选择物品i 装入背包时,可以选择物品i 的一部分,而不一定要全部装入背包.
算法分析:
首先计算每种物品的单位重量的价值, 然后依贪心策略,将尽可能多的单位重量价值最高的物品装入背包.
实现:
/*
* description: 背包问题
* 问题描述:与0-1背包问题类似,所不同的是在选择物品i装入背包时,可以选择
* 物品i的一部分,而不一定要全部装入背包.
* 算法分析:贪心算法
* 首先计算每种物品的单位重量的价值,然后依贪心策略,将尽可能多的单位重量价值最高的物品装入背包.
*
* date: 2010/12/5
* auther:cm
*/
import java.util.Arrays;
import java.util.Collections;
public class Pack
{
//物品数组
private Goods[] g;
//最大价值
private double maxValue;
//背包容量
private double c;
public Pack(double[] w, double[] v, double c)
{
int n = w.length;
g = new Goods[n];
//初始化
for (int i = 0; i < n; i++)
{
g[i] = new Goods(w[i], v[i]);
}
this.c = c;
}
public double pack()
{
Arrays.sort(g,Collections.reverseOrder());//按性价比排序 由大到小
double value = 0.0;
double this_c = c;
for (int i = 0; i < g.length; i++)
{
if (this_c >= g[i].getWeight())
{
value += g[i].getValue();
this_c -= g[i].getWeight();
}
else
{
value += this_c * g[i].getAverage();
break;
}
}
maxValue = value;
return value;
}
public void print()
{
for (int i = 0; i < g.length; i++)
{
System.out.print(g[i].getAverage() + " ");
}
}
public static void main(String[] args)
{
double[] w = {10,20,30};
double[] v = {60, 100, 120};
double c = 50;
Pack p = new Pack(w, v, c);
System.out.println(p.pack());
//p.print();
}
}
注:使用贪心策略无法解决0-1背包问题