Java实现0-1背包问题

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

首先简单的介绍一下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<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的每一项加上w
		for(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;
			}
		}	
	}
}
程序最后输出的最后一个值就是获得的最大价值。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值