回溯算法之装载问题

/*

1.因为很多变量多要在两个main和Backtrack中共用,所以就把这些公用的变量设置为全局变量,

在函数中直接赋值而不能再次定义 否则赋值给的就是局部变量在其他的函数中不能使用

2.c++中数组的定义:

1.数组的长度只能在[]中定义,而且必须是常量表达式或用const修饰的变量且该变量在函数运行之前

 就已经知道值是多少;

2.int a[4]={1,2,3,4};{}称为初始化列表,如果在数组定义的时候没有对其进行初始化

 则以后只能向普通变量那样挨个赋值了。如果一开始没有初始化,而且该数组定义在函数外部,则

 系统默认设置初值为0;若在函数内部则没有默认值。

3.当数组中的元素是字符串的时候 最后一个字符为默认的\0

4.不允许数组直接赋值和赋值,即不允许将一个数组的值直接赋给一个新的数组;可以通过for循环依次赋值

   指针:

1.避免使用未初始化的指针

2.指针初始化与赋值的约束:

1.0值常量表达式;int zero=0;const int c=0;int *p;p=zero;(error);*p=c;*p=0;

2.类型匹配的对象的地址;p=&a;

3.使用指针访问数组元素;int a[]={1,2,3,4};int *p=a(p=a;);如果希望p指向别的元素则p=&a[2],则*p就等于a[2];

*p(+1)就等于a[3];*p+1=a[2]+1;

*/

#include <iostream>  

using namespace std;   

int n,          //集装箱数  

*x=new int[4],         //当前解  

*bestx=new int[4],     //当前最优解  

*w,

//w[4]={5,10,30,40},    //集装箱重量数组  

c,     //第一艘轮船的载重量  

c2,       //当前载重量  

r,          //剩余集装箱重量         

bestw=0,     //当前最优载重量 

cw=0;  

void Backtrack (int i)// 搜索第i层结点  

{  


if (i > n)// 到达叶结点  


{    


if (cw>bestw)  


{  


for(int j=0;j<=n;j++)   


{  


bestx[j]=x[j];//更新最优解  


bestw=cw;   


}  


}   


return ;  


}  


r-=w[i];   


if (cw + w[i] <= c) // 搜索左子树  


{   


x[i] = 1;  


cw += w[i];  


Backtrack(i+1);  


cw-=w[i];      


}  


if (cw + r > bestw)  


{  


x[i] = 0;  // 搜索右子树  


Backtrack(i + 1);    


}  


r+=w[i]; 

}  

int main()  

{     


n=3;  


c=50;


c2=60;


int a[4]={5,10,30,40};


//w=&a;//应该是w=&a[4];这只是指向了另一个变量

//1>d:\documents\visual studio 2010\projects\test1\装载问题.cpp(72): error C2440: “=”: 无法从“int (*)[4]”转换为“int *”


w=a;//将数组a的地址赋给w


//w[0]=5;w[1]=10;w[2]=30;w[3]=40;


//*x=new int[4];


//*bestx=new int[4];  


for (int i=0;i<=n;i++)  


{  


r+=w[i];  


}  


Backtrack(0);  


cout<<“轮船的载重量分别为:”<<endl;  


cout<<“c(1)=”<<c<<“,c(2)=”<<c2<<endl;  


cout<<“待装集装箱重量分别为:”<<endl;  


cout<<“w(i)=”;  


for (int i=0;i<=n;i++)  


{  


cout<<w[i]<<” “;  


}  


cout<<endl;  


cout<<“回溯选择结果为:”<<endl;  


cout<<“m(1)=”<<bestw<<endl;  


cout<<“x(i)=”;  


for (int i=0;i<=n;i++)  


{  


cout<<bestx[i]<<” “;  


}  


cout<<endl;  


int m2=0;  


for (int j=0;j<=n;j++)  


{  


m2=m2+w[j]*(1-bestx[j]);  


}  


cout<<“m(2)=”<<m2<<endl;  


if(m2>c2)  


{  


cout<<“因为m(2)大于c(2),所以原问题无解!”<<endl;  


}  


cin.get();


return 0;  

}  

    原文作者:回溯法
    原文地址: https://blog.csdn.net/qq_31955775/article/details/51225390
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞