回溯算法之装载问题

来源:互联网 发布:it人才缺口 编辑:程序博客网 时间:2024/05/18 18:17
/*
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;  
}  

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 数据分析 二值图像 二值图像连通 ajax时间 ajax获取时间传到后台 ajax获取服务器时间传到后台 submit提交时怎么将提交的时间传入后台 gethostbyname 分节符快捷键 ErrorPage! Reason:*Networkbusy*InvalidURL*Failedto install_flash_player_10_active_x 伊织 伊织调教 起重机司机学习 ssni 输入梯形上底下底高,输出面积 python语言,输入梯形上底下底高输出面积 网易产品 https://www.csdndoc.com/blog/390696 https://www.cocoacontrols.com 风之教堂 黄色网站 AV网站 439973416 فیلترشکن WS_CLIPCHILDREN设置键在哪里 数据结构(严蔚敏李冬梅)课后答案 ipz809 一个字包含的二进制位数 linux面试 【题目2】设计一个结构体类型,包含姓名、出生日期。其中出生日期又包含年、月、日三部分信息。输入n个好 【题目2】设计一个结构体类型,包含姓名、出生日期。其中出生日期又包含年、月、日三部分信息。输入n个好 结构体比较好友中年纪最小的 matlab三维矩阵可视化 使QQ崩溃 scanIP 按照规定,在高速公路上行使的机动车,达到或超出本车道限速的10%则处200元罚款;若达到或超出50% c语言输入三个数字 c语言如何输入三个数求平均值 c语言如何输入三个数求和 C语言为什么只录入了第一个数字