背包问题(广度优先搜索解法)
问题描述:有n件物品,每件物品的重量为W[i],价值为C[i].现在需要选出若干物件放入一个容器量为V的背包中,使得在选入背包的物品重量和不超过V的前提下,让背包中的物品价值之和最大,求最大价值
public static void main(String[] args) {
// TODO Auto-generated method stub
int [] weight=new int[]{2,6,9,5,4};
int[] value = new int[] { 5, 9, 10, 4, 1 };
int n=value.length;
int size = 16; //背包最大容量
int maxValue=0;
Queue<int[]> q=new LinkedList<int[]>(); //定义队列
q.offer(new int[]{0,0,0}); //不放0号物品的情况
if(weight[0]<=size) //判断0号是否放入背包
q.offer(new int[]{0,weight[0],value[0]}); //放入0号物品的情况
while(!q.isEmpty()) //如果队列不为空,广度遍历物品选择状态树
{
//node[0]存储当前是几号物品,node[1]重量和,node[2]价值和
int[] node=q.poll(); //从队列取出物品选择状态树的结点node
if(node[0]<n-1) //如果不是最后一个物品
{
int newWeights=node[1]+weight[node[0]+1];//加上下一个物品的重量
int newValues=node[2]+value[node[0]+1];//加上下一个物品的价值
if(newValues>maxValue && newWeights<=size)//如果加上下一个物品不超出背包容量,且大于原来的最大价值
maxValue=newValues; //更新可放入的最大价值
if(node[0]<n-2) //如果不是倒数第二个物品
{
q.offer(new int[]{node[0]+1,node[1],node[2]}); //不选择下一个物品
if(newWeights<size) //下一个物品能入进背包就放进队列里
q.offer(new int[]{node[0]+1,newWeights,newValues});
}
}
}
System.out.print(maxValue);
}