回溯法举例(装载问题+图着色问题)(java)

这篇博客介绍了如何使用回溯法解决装载问题和图着色问题。在装载问题中,算法通过maxloading函数和backtrack回溯算法寻找最优解,实现了O(n*2^n)的时间复杂度。而在图着色问题中,mcoloring算法结合backtrack和ok函数进行颜色分配,时间复杂度为O(n*m^n)。博客提供了详细的代码实现和运行结果分析。
摘要由CSDN通过智能技术生成

1.装载问题

1.算法设计: 一个maxloading函数用于初始化成员变量,并调用backtrack回溯算法,接着backtrack回溯算法对子树进行搜索;测试类进行数据调试。
2.代码实现

public class Loading {
   
     static int n;   //集装箱数
     static int []w;   //集装箱重量数组
     static int c1;   //第一艘船重量
     static int c2;   //第二艘船重量
     static int cw;   //当前载重量
     static int bestw;   //当前最优载重量
     static int r;     //剩余集装箱重量
     static int []x;    //当前解
     static int []bestx;   //当前最优解

     public static int maxloading(int []ww,int cc,int []xx) {
   
    	 n=ww.length-1;
    	 w=ww;
    	 c1=cc;
    	 cw=0;
    	 bestw=0;
    	 x=new int[n+1];
    	 bestx=xx;
    	 for(int i=1;i<=n;i++) 
    		 r+=w[i];
    	 
    	 backtrack(1);
    	 return bestw;
     }

     private static void backtrack(int i) {
   
//搜索第i层节点
    	 if(i>n) {
   //到达叶节点 
    		 if(cw>bestw) {
   
    			 for(int j=1;j<=n;j++) 
    				 bestx[j]=x[j];
    			 bestw=cw;
    		 }
    		 return ;
    	 }
//搜索子树
    	 r-=w[i];
    	 if(cw+w[i]<=c1) {
   //搜索左子树
    		 x[i]=1;
    		 cw+=w[i];
    		 backtrack(i+1);
    		 cw-=w[i];
    	 }
    	 if(cw+r>bestw) {
   
    		 x[i]=0;   //搜索右子树
    		 backtrack(i+1);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值