0-1背包問題
在0 / 1背包問題中,需對容量為c 的背包進行裝載。從n 個物品中選取裝入背包的物品,每件物品i 的重量為wi ,價值為pi 。
對于可行的背包裝載,背包中物品的總重量不能超過背包的容量,最佳裝載是指所裝入的物品價值最高。
本題采用回溯法進行求解:
代碼如下:
public class Package {
/**
* @param args
*/
private int num=10;
int[] W={19,23,12,34,24,34,56,24,53,35}; //背包重量
int[] V={57,68,87,17,12,21,31,42,14,15}; //背包權值
private int[] a=new int[10];
int C=300;
static int MaxValue=0; //背包背的最大權值
public static void main(String[] args) {
// TODO Auto-generated method stub
Package p=new Package();
p.ReadData();
p.Search(0);
PrintMaxValue();
}
public void ReadData(){
for(int i=0;i<num;i++){
System.out.println("弟"+i+"的重量和價值是:"+W[i]+" "+V[i]);
}
}
public void Search(int m){
if(m>=num){
CheckMax();
}
else {
a[m]=0;
Search(m+1);
a[m]=1;
Search(m+1);
}
}
public void CheckMax(){
int Weight=0;
int Value=0;
for(int i=0;i<num;i++){ //判斷是否到達上限
if(a[i]==1){
Weight=Weight+W[i];
Value=Value+V[i];
}
}
if(Weight<=C){
if(Value>MaxValue){
MaxValue=Value;
System.out.println("最大價值是:"+MaxValue);
}
}
}
public static void PrintMaxValue(){
System.out.println(" 最終的最大價值是:"+MaxValue);
}
}