枚举法实现0-1背包问题

给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?在装入背包时,每种物品i只有两种选择:装入或者不装入。既不能装入多次,也不能只装入一部分。
(1)背包容量C为6,n为4,物品重量和价值如下图所示,如何选取使得背包总价值最大?使用穷举法编程实现。

public class List {
public static void main(String[] args) {
int[] w= {3,4,5,2}; //存每个物品的重量
int[] v= {7,9,9,2}; //存每个物品的价值
int p=6;
int value=0;
int[] a= new int[15]; //存各种组合下的重量
int[] b= new int[15]; //存各种组合下的价值
a[0]=w[0];
a[1]=w[1];
a[2]=w[2];
a[3]=w[3];
a[4]=w[0]+w[1];
a[5]=w[0]+w[2];
a[6]=w[0]+w[3];
a[7]=w[1]+w[2];
a[8]=w[1]+w[3];
a[9]=w[2]+w[3];
a[10]=w[0]+w[1]+w[2];
a[11]=w[0]+w[1]+w[3];
a[12]=w[0]+w[2]+w[3];
a[13]=w[1]+w[2]+w[3];
a[14]=w[0]+w[1]+w[2]+w[3];
b[0]=v[0];
b[1]=v[1];
b[2]=v[2];
b[3]=v[3];
b[4]=v[0]+v[1];
b[5]=v[0]+v[2];
b[6]=v[0]+v[3];
b[7]=v[1]+v[2];
b[8]=v[1]+v[3];
b[9]=v[2]+v[3];
b[10]=v[0]+v[1]+v[2];
b[11]=v[0]+v[1]+v[3];
b[12]=v[0]+v[2]+v[3];
b[13]=v[1]+v[2]+v[3];
b[14]=v[0]+v[1]+v[2]+v[3];
System.out.println(“物品的组合数共有以下种类:”);
System.out.println(“第[1]种:1号”);
System.out.println(“第[2]种:2号”);
System.out.println(“第[3]种:3号”);
System.out.println(“第[4]种:4号”);
System.out.println(“第[5]种:1号,2号”);
System.out.println(“第[6]种:1号,3号”);
System.out.println(“第[7]种:1号,4号”);
System.out.println(“第[8]种:2号,3号”);
System.out.println(“第[9]种:2号,4号”);
System.out.println(“第[10]种:3号,4号”);
System.out.println(“第[11]种:1号,2号,3号”);
System.out.println(“第[12]种:1号,2号,4号”);
System.out.println(“第[13]种:1号,3号,4号”);
System.out.println(“第[14]种:2号,3号,4号”);
System.out.println(“第[15]种:1号,2号,3号,4号”);
int[] c= new int[15];
for(int i=0;i<=14;i++) {
//把不超重的组合的价值放进c[ ]
if(a[i]<=p) {
c[i]=b[i];
// System.out.println(“c[”+i+"]="+c[i]);
}
else {
c[i]=0; //若超重,则将c[i]置为0
}
}
int max=c[0];
//找出c[i]中的最大值
for(int j=0;j<c.length;j++){
if(c[j]>max) max=c[j];
}
//找出最大值在数组c中的位置
for(int m=0;m<c.length;m++) {
if(c[m]==max) //System.out.println(“c[”+m+"]");
System.out.println(“背包中物品的组合是第[”+(m+1)+"]种");
}
System.out.println(“背包最大的总价值是”+max);
}
}

猜你喜欢

转载自blog.csdn.net/weixin_44000439/article/details/84863519
今日推荐