zoukankan      html  css  js  c++  java
  • 回溯法 | 子集树:装载问题

    学习链接:回溯法:最优装载问题回溯法最优装载问题(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 }
  • 相关阅读:
    ACM常用算法及练习(2)
    ACM常用算法及练习(1)
    ACM进阶计划
    《算法艺术与信息学竞赛》题目-提交方式对照表
    ACM之Java速成(4)
    ACM之Java速成(3)
    ACM之Java速成(2)
    ACM之Java速成(1)
    uva 11520
    uva 10755
  • 原文地址:https://www.cnblogs.com/TQCAI/p/7681264.html
Copyright © 2011-2022 走看看