java 0 1背包_Java实现0-1背包问题 | 学步园

首先简单的介绍一下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;

}

}

}

}

程序最后输出的最后一个值就是获得的最大价值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值