學習鏈接:回溯法:最優裝載問題、回溯法最優裝載問題(java)
輸入:
int[]w={21,10,5}; Load_Cargo problem=new Load_Cargo(w,34);
輸出:
最大裝載量:31
應裝入的貨物:1 2
java代碼:
1 class Load_Cargo{//裝載問題 2 int[] w;//各貨物的重量 3 int wMax;//最大載重量 4 int nowWei=0;//當前載重量 5 int bestWei=0;//最優重量 6 7 int restCargo=0;//剩余貨物重量 8 int cargo_len=0;//貨物數目 9 10 int []x;//當前解向量 11 int []bestX;//最優解 12 13 Load_Cargo(int[] w,int wMax){ 14 this.w=w; 15 this.wMax=wMax; 16 cargo_len=w.length; 17 x=new int[cargo_len]; 18 bestX=new int[cargo_len]; 19 int i; 20 for(i=0;i<cargo_len;i++){ 21 restCargo+=w[i]; 22 } 23 } 24 void solve(){ 25 BackTrace(0); 26 System.out.println("最大裝載量:"+bestWei); 27 System.out.print("應裝入的貨物:"); 28 for(int i=0;i<cargo_len;i++){ 29 if(bestX[i]==1){ 30 System.out.print((i+1)+" "); 31 } 32 } 33 System.out.println(); 34 } 35 void BackTrace(int t){ 36 if(t<cargo_len){//如果沒有抵達葉子節點 37 restCargo-=w[t];//剩余貨物 減去 當前貨物重量 38 //遍歷左子樹 39 if(nowWei+w[t]<=wMax){//如果當前貨物能放入 40 nowWei+=w[t]; 41 x[t]=1; 42 BackTrace(t+1); 43 nowWei-=w[t]; 44 } 45 //遍歷右子樹 46 if(nowWei+restCargo>bestWei){//如果當前重量 加上 剩余貨物 比最優解重 47 x[t]=0; 48 BackTrace(t+1); 49 } 50 restCargo+=w[t];//恢復 剩余貨物重量 51 }else{//葉子節點,回溯完畢 52 int a; 53 a=0; 54 if(nowWei>bestWei){//當前重量大於剩余重量 55 //更新最優解向量 56 bestX=x.clone(); 57 bestWei=nowWei; 58 } 59 } 60 } 61 62 }