首先简单的介绍一下0-1背包问题:有一个背包,有一定的容量,有几件物品,物品有重量和价值,选择物品放到背包中,使背包的中的物品在背包能够装下的条件下,价值最大。物品只有两种选择,装入或者不装入。
下面是程序的代码:
import java.util.Collections;
import java.util.LinkedList;
class WuPin implements Comparable
{
@Override
public String toString()
{
return "WuPin [weight=" + weight + ", value=" + value + "]";
}
private int weight;
private int value;
public WuPin(int weight, int value) {
super();
this.weight = weight;
this.value = value;
}
public int getValue() {
return value;
}
public int getWeight() {
return weight;
}
@Override
public int compareTo(Object o)
{
WuPin obj =(WuPin)o;
return this.weight>obj.getWeight()?1:(this.weight==obj.getWeight()?0:-1);
}
}
public class BeiBao {
public static void main(String[] args)
{
LinkedList wuPinList = new LinkedList();
wuPinList.add(new WuPin(2,6));
wuPinList.add(new WuPin(2,3));
wuPinList.add(new WuPin(6,5));
wuPinList.add(new WuPin(5,4));
wuPinList.add(new WuPin(4,6));
final int N = 6;//代表共有几个物品
LinkedList p = new LinkedList();
p.add(new WuPin(0,0));//添加第一个为零的值
for(int i =4;i>=0;i--)
{
jisuan(p,wuPinList.get(i));
System.out.println("p"+(i+1));
for(int ii = 0;ii
System.out.println((WuPin)p.get(ii));
}
}
//用来计算添加物品
private static void jisuan(LinkedList p, WuPin pin) {
LinkedList q = new LinkedList();
//计算得到q 即p的每一项加上w
for(int i = 0;i
{
q.add(new WuPin(((WuPin)p.get(i)).getWeight()+pin.getWeight(),((WuPin)p.get(i)).getValue()+pin.getValue()));
}
//System.out.println("得到的q");
//for(int i = 0;i
//System.out.println((WuPin)q.get(i));
//求p n-1 即将p n 和q n合并
for(int m = 0;m
{
p.add((WuPin)q.get(m));
}
Collections.sort(p);//将背包中的物品按照重量排序
//System.out.println("p和q合并之后的p");
//for(int i = 0;i
//System.out.println((WuPin)p.get(i));
//去掉跳跃点
for(int m = 0;m
{
//如果后面的value小于前面 删除
//System.out.println("dijici"+m);
//for(int i = 0;i
//System.out.println((WuPin)p.get(m));
if(m+1<=p.size()-1)
if(((WuPin)p.get(m)).getValue()>=((WuPin)p.get(m+1)).getValue())
{
p.remove(m+1);
m=0;
}
if(((WuPin)p.get(m)).getWeight()>10)
{
p.remove(m);
m=0;
}
}
}
}
程序最后输出的最后一个值就是获得的最大价值。