Java实现0-1背包问题

来源:互联网 发布:淘宝批量下架 编辑:程序博客网 时间:2024/06/07 16:07

【作者:孟祥月  博客:http://blog.csdn.net/mengxiangyue】

首先简单的介绍一下0-1背包问题:有一个背包,有一定的容量,有几件物品,物品有重量和价值,选择物品放到背包中,使背包的中的物品在背包能够装下的条件下,价值最大。物品只有两种选择,装入或者不装入。

算法的基本思想是:从最后一个物品开始装入,有两种选择,记录两个点,然后再装入倒数第二件,使前面的两个点分别加上这件物品,得到另外两个点,使这四个点合并,排序,去掉其中的跳跃点,然后再装入前一个,一直循环到第一个。具体的描述可以参照计算机算法分析与设计,王晓东第三版的第二章。

下面是程序的代码:

import java.util.Collections;import java.util.LinkedList;class WuPin implements Comparable{@Overridepublic 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;}@Overridepublic 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<WuPin> wuPinList = new LinkedList<WuPin>();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<p.size();ii++)System.out.println((WuPin)p.get(ii));}}//用来计算添加物品private static void jisuan(LinkedList p, WuPin pin) {LinkedList q = new LinkedList();//计算得到q 即p的每一项加上wfor(int i = 0;i<p.size();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<q.size();i++)//System.out.println((WuPin)q.get(i));//求p n-1 即将p n 和q n合并for(int m = 0;m<q.size();m++){p.add((WuPin)q.get(m));}Collections.sort(p);//将背包中的物品按照重量排序//System.out.println("p和q合并之后的p");//for(int i = 0;i<p.size();i++)//System.out.println((WuPin)p.get(i));//去掉跳跃点for(int m = 0;m<p.size();m++){//如果后面的value小于前面 删除//System.out.println("dijici"+m);//for(int i = 0;i<p.size();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;}}}}
程序最后输出的最后一个值就是获得的最大价值。

原创粉丝点击