列舉法實現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(“揹包中物品的組合是第[”+(m+1)+"]種");
}
System.out.println(“揹包最大的總價值是”+max);
}
}