/*
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;
}