算法设计与分析实验报告验优参考

相关算法分析的代码(自写)和大佬的拓展代码都放在资料区提供下载
具体内容如下:
在这里插入图片描述
自写的:在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上一届算法大佬留给我们拓展的:(想多写一点,后续想参加蓝桥杯等等比赛的可以参考大佬的一些程序)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述在这里插入图片描述
不多bb了,直接上自己之前验优报告:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、程序设计


void MatrixChain(int p[],int n, int **m,int **s){   //p是输入的行列,n是矩阵的个数,m数组存最优值,
s存最优断点位置,主要定义函数的二维数组只能用指针
for(int i=1;i<=n;i++)
	m[i][i]=0;                                //  i=j时,最优值为0
for(int r=2;r<=n;r++){                     //r是对角线的序号,上面已经有1(r=1全为0),从2开始
	for(int i=1;i<=n-r+1;i++){              //(n-r+1)是为了保证优先每一个对角线先输出,
再往上走,从下往上计算最优值保存在数组m中
	  int j=i+r-1;                        //把j=n代入i=n-r+1得j的定义,也是为了对角线输出
          m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];     //赋初值,先在i处断开,下面再做比较
		s[i][j]=i;
		for(int k=i+1;k<j;k++){    //从i+1开始比较,然后小的保存下来
			int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];     
			if(t<m[i][j]){
				m[i][j]=t;
				s[i][j]=k;         //s数组同步断的位置
				}
			}               //大的循环体,一直循环,知道m数组所有值算出来,
最后只需要输出m[1][n]就可以得到最优值
		}
	}
}

void Traceback(int i,int j,int **s){         //构造最优解
	if(i==j){
		return;                    //递归出口
	}
	Traceback(i,s[i][j],s);
    Traceback(s[i][j]+1,j,s);
	cout<<"A["<<i<<","<<s[i][j]<<"]";                 //输出断的地方(i,s[i][j]),在s[i][j]断的
	cout<<"and A["<<s[i][j]+1<<","<<j<<"]"<<endl;         //输出断的地方的下一个s[i][j]+1
} 

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

程序设计
程序段一:求解最优值
void knaspack(int n, int j,int *v,int *w,int **m){
	int k,c;   //定义第K个物品和背包剩余的容量为c
    for(k=0;k<=j;k++){
		m[0][k]=0;
	}
	for(k=0;k<=n;k++){
		m[k][0]=0;
	}
//一定要先赋给0行0列初值才可以开始填表过程,不然下面程序没有对比的量
	for(k=1;k<=n;k++){           
		for(c=1;c<=j;c++){            //可以发现表是一行一行填充的
			if(w[k]>c){        //第k个物品重量大于当前背包容量,放不进去
				m[k][c]=m[k-1][c];                    //k表示前面k个物品
			}
			else{     
//第k个物品重量小于等于当前背包容量,可以选择放和不放第k个
				int V1=m[k-1][c-w[k]]+v[k];   //放
				int V2=m[k-1][c];            //不放,看前面的物品
				if(V1>V2)
					m[k][c]=V1;      
//可以看出表下面的数据要参考表上面的数据才可以填充,这里找max
				else
                    m[k][c]=V2;			
			}
		}
	}
}	

程序段二:输出构造的最优解
void  xuhao(int *v,int *w,int **m,int n,int j){
	int i=n;
	for(int c=j;j>0;)  //j还没有小于等于0的时候,逆推找放进去的物品序号
	{
		if(m[i][c]==m[i-1][c])
		{
			i--;
		}
		else
		{
			cout<<i<<" ";
			c-=w[i];    //减去放进去的找前面的
			i--;
		}
	}
}		

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、程序设计
求解最优值以及最优解:
	void backtrack(int t){   //回溯函数
	if(t>n){      //到叶节点即输出
		if(cv>bestv){
			bestv=cv;
			for(int i=1; i<=n; ++i)
                bestx[i] = x[i];   //每次找到最优值,更新一次最优解数组
		}
		return ;
	}
	r-=v[t]; //更新r,去下一步搜索左子树
	if(cw+w[t]<=c){    //满足条件才去搜索左子树,左子树都是1,放入
		x[t]=1;
		cw+=w[t];
		cv+=v[t];
		backtrack(t+1);
		cw-=w[t];
		cv-=v[t];   //回溯,恢复
	}
	if(cv+r>bestv){   
//括号内是剪枝函数,这是搜索右子树的条件,右子树都是0,不放入的
		x[t]=0;
		backtrack(t+1);
	}
	r+=v[t]; //   加回来是为了回溯到拓展节点,重新去往另一边搜索
}

在这里插入图片描述
在这里插入图片描述

笔者介绍:某智科卑微牛马,一项省级大创已结项,一项国家级大创和一项校级大创已成功立项,都交给小自己一届的学弟去做,参加的挑战杯项目在其余队友参加大创后也获得了省级优秀和国家级优秀结项。同时组织并担任了2022年挑战杯、两项互联网+、电子商务大赛、舞蹈机器人大赛、“创青春”青年创新创业大赛的队长,并参加过节能减排大赛、调研河北大赛、数学建模美赛、蓝桥杯省赛、机器人国赛等比赛若干,获得过舞蹈机器人一等、电子商务大赛二等、挑战杯三等、节能减排省一等、创新创业优秀个人、社会实践优秀个人等奖项。

程序下载说明:作者所有的实验、课设验收基本都是优,也不缺这几米,不过不想自己的文章或者作品烂大街,想留点门槛,应该是几米这样子,作品都是保证高质量的,给有需要的学弟学妹们学习,大部分还是免费的,因为一些大型的文件不好上传,故放在付费资料区下载,真的非常良心!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华电第一深情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值