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;}}}}程序最后输出的最后一个值就是获得的最大价值。
- Java实现0-1背包问题
- 背包问题-java实现
- 背包九讲之0-1背包问题 滑动数组实现 Java实现
- 0/1背包问题实现
- Java实现回溯法解决0-1背包问题
- 动态规划算法0-1背包问题java实现
- 算法java实现--动态规划--0-1背包问题
- 算法java实现--回溯法--0-1背包问题
- 算法java实现--分支限界法--0-1背包问题
- 0-1背包问题分支定限法Java实现
- 动态规划之0/1背包问题-java实现
- 贪心法和回溯法 求解“背包、0/1背包问题”——Java 实现
- java 0-1背包问题
- 01背包问题(java实现)
- 01背包问题Java实现
- Java实现-背包问题I
- Java实现-背包问题II
- Java实现-背包问题VI
- TreeView
- 关于判断字符串参数是否是整型参数或者浮点型参数的方法
- JavaWeb 登陆操作和注册操作的实现
- Centos就是很稳定
- python random模块与实例
- Java实现0-1背包问题
- sql语句-批量替换
- windows下emacs中cedet的配置
- 十佳影片大全
- Python建立SSH连接的方法
- 使用事件同步线程
- pexpect模块的学习
- 返回vector对象与引用的区别
- origin8.1中文乱码设置方法