算法设计与分析实验源代码及运行结果.docx

上传人:b****8 文档编号:11265898 上传时间:2023-02-26 格式:DOCX 页数:13 大小:113.60KB
下载 相关 举报
算法设计与分析实验源代码及运行结果.docx_第1页
第1页 / 共13页
算法设计与分析实验源代码及运行结果.docx_第2页
第2页 / 共13页
算法设计与分析实验源代码及运行结果.docx_第3页
第3页 / 共13页
算法设计与分析实验源代码及运行结果.docx_第4页
第4页 / 共13页
算法设计与分析实验源代码及运行结果.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

算法设计与分析实验源代码及运行结果.docx

《算法设计与分析实验源代码及运行结果.docx》由会员分享,可在线阅读,更多相关《算法设计与分析实验源代码及运行结果.docx(13页珍藏版)》请在冰豆网上搜索。

算法设计与分析实验源代码及运行结果.docx

算法设计与分析实验源代码及运行结果

1.分治法二分检索源代码:

#include

usingnamespacestd;

voidSelectSort(int*pData,intCount

{

intiTemp;

intiPos;

for(inti=0;i

{

iTemp=pData[i];

iPos=i;

for(intj=i+1;j

{

if(pData[j]

{

iTemp=pData[j];

iPos=j;

}

}

pData[iPos]=pData[i];

pData[i]=iTemp;

}

}

voidmain(

{

intiCount;

cout<<"请输入要排序的个数:

"<

cin>>iCount;

intData[2000];

cout<<"请输入原始数据:

"<

for(intk=0;k

{

cout<<"Data["<

cin>>Data[k];

}

cout<<"排序之前的数据顺序为:

"<

for(intj=0;j

{

cout< ";

}

cout<

cout<<"排序之后的数据顺序为:

"<

SelectSort(Data,iCount;

for(inti=0;i

{

cout<

}

cout<

}

运行结果截图:

2.分治法排序源代码:

#include

#include

usingnamespacestd;

intdivide(int*list,intlow,inthigh

{

intpivotkey=list[low];

while(low

{

while(low=pivotkeyhigh--;

list[low]=list[high];

while(low

list[high]=list[low];

}

list[low]=pivotkey;

returnlow;

}//一次划分;

voidsort(int*list,intlow,inthigh

{

if(low

{

intpivotloc=divide(list,low,high;

sort(list,low,pivotloc-1;

sort(list,pivotloc+1,high;

}

}//快速排序算法;

intmain(

{

intarry[100];

inti;

cout<<"Thearrytobesortedare:

"<

for(i=0;i<100;i++

{

arry[i]=rand(%100;

cout<

}

sort(arry,0,99;

cout<

for(i=0;i<100;i++

{

cout<

}

return0;

}

运行结果截图:

1.货郎担问题源代码:

#include

#include

#include

#defineNUM4

usingnamespacestd;

intnum=(intpow(2,NUM-1;

classsubset

{

public:

boolcontains[NUM-1];//除了开始结点外,包含哪个城市就把相应的contains设置为1;

boolis_in(inti

{

i--;

if(contains[i]returntrue;

elsereturnfalse;

}//判断第i个城市是否在子集中,如果在返回true,否则false;

};//所有节点城市的子集。

voidset_ct(subset*s,intbegin,intend,intprocess

{

if(NUM-2==process

{

s[begin].contains[process]=false;

s[end].contains[process]=true;

}

else

{

intmiddle=(end+begin/2;

inti;

for(i=begin;i<=middle;i++

s[i].contains[process]=false;

set_ct(s,begin,middle,process+1;

for(i=middle+1;i<=end;i++

s[i].contains[process]=true;

set_ct(s,middle+1,end,process+1;

}

}//用递归的方法初始化子集结点;

intcombian(inta,intb

{

if(b>=0&&a>=b

{

if(0==b||a==breturn1;

else

{

if(a-b

inti,result=1;

for(i=a-b+1;i<=a;i++

result*=i;

for(i=2;i<=b;i++

result/=i;

returnresult;

}

}

elsereturn-1;

}//组合数(a选b)的计算,数据合法返回正确的值,否则返回-1,

intget_h(bool*c,intn

{

inti,result=0;

for(i=0;i

{

if(i!

=n&&c[i]result+=(intpow(2,NUM-2-i;

}

returnresult;

}//计算table_d表的横坐标horizontal,

intmain(

{

int**cities=newint*[NUM];//存储个城市之间的代价矩阵

int**table_d=newint*[NUM];//存储动态距离表

int**table_p=newint*[NUM];//存储动态结点选在表

subset*sbst=newsubset[num];//所有城市节点的子集。

inti,j,k,temp,horizontal;

for(i=0;i

{

cities[i]=newint[NUM];

table_d[i]=newint[num];

table_p[i]=newint[num];

for(j=0;j

cin>>cities[i][j];

table_d[i][0]=cities[i][0];//初始化距离表的第一列

}

/*

cities[0][0]=32767;cities[0][1]=3;cities[0][2]=6;cities[0][3]=7;

cities[1][0]=5;cities[1][1]=32767;cities[1][2]=2;cities[1][3]=3;

cities[2][0]=6;cities[2][1]=4;cities[2][2]=32767;cities[2][3]=2;

cities[3][0]=3;cities[3][1]=7;cities[3][2]=5;cities[3][3]=32767;

for(i=1;i

table_d[i][0]=cities[i][0];

*/

set_ct(sbst,0,num-1,0;

for(j=1;j

{

for(i=1;i

{

if(!

sbst[j].contains[i-1]

{

table_d[i][j]=32767;

for(k=1;k

{

if(sbst[j].contains[k-1]

{

horizontal=get_h(sbst[j].contains,k-1;//计算出此时的table_d的横坐标。

temp=cities[i][k]+table_d[k][horizontal];

if(temp

{

table_d[i][j]=temp;//将最短距离存入距离表

table_p[i][j]=k;//将选择的结点存入节点表;

}

}

}//对子集中的每一个元素计算各自被选择时的距离,然后选择最少的。

}//子集j中不包含i时

}//扫描该列的每一行

}//逐列扫描;

table_d[0][num-1]=32767;

for(i=NUM-1;i>0;i--

{

horizontal=get_h(sbst[num-1].contains,i-1;

temp=cities[0][i]+table_d[i][horizontal];

if(temp

{

table_d[0][num-1]=temp;

table_p[0][num-1]=i;

}

}

cout<<"Theshortestdistanceis:

"<

cout<<"Thepathis:

0->"<";

temp=table_p[0][num-1];

horizontal=get_h(sbst[num-1].contains,temp-1;

for(i=1;i

{

cout<";

temp=table_p[temp][horizontal];

horizontal=get_h(sbst[horizontal].contains,temp-1;

}

cout<<0;

return0;

}

运行结果截图:

当各城市距离都相等,比如1时:

当输入课件中讨论的数据时:

当输入上述矩阵按其主对角线对换后的矩阵的数据时:

路径刚好跟上面的相反。

2.投资问题源代码:

#include

#include

usingnamespacestd;

#defineN5//工程数;

#defineA10//资金总数;

intmain(

{

int**g=newint*[N];//NXA的矩阵,存储对工程i投资j万元的利润;

int**table=newint*[N+1];//(N+1X(A+1矩阵,存入动态决策表;

int**cash=newint*[N];//NXA的矩阵,存储各工程的投资数

int*result=newint[N];//记录最终结果,用于输出;

inti,j,k,temp;

for(i=0;i

{

cash[i]=newint[A];

g[i]=newint[A];

table[i]=newint[A+1];

table[i][0]=0;//table的第一列赋0;

}//给各矩阵分配空间;

table[N]=newint[A+1];

table[N][0]=0;

for(i=A;i>0;i--table[0][i]=0;//table第一行赋0;

cout<<"Theprofitofj*10000yuaninvesttoprojectiare:

"<

for(i=0;i

{

for(j=0;j

{

g[i][j]=rand(%5;

cout<

}

cout<

}//为了方便,随机给利润矩阵g赋值;

cout<

for(i=1;i<=N;i++//对每一列:

for(j=1;j<=A;j++//对该列的每一个元素

{

table[i][j]=table[i-1][j];

cash[i-1][j-1]=0;

for(k=1;k<=j;k++

{

temp=table[i-1][j-k]+g[i-1][k-1];//有递推关系和前面已经求出的table得出当前的。

if(temp>table[i][j]

{

table[i][j]=temp;

cash[i-1][j-1]=k;

}//记下在有j万元资金的情况下投资前i个工程的最大利润,同时记录投资工程i的资金到cash中

}

}

temp=A-1;

for(i=N-1;i>=0;i--

{

result[i]=cash[i][temp];

temp-=result[i];

}//从cash表格中得出最终结果;

cout<<"Investmenttoeachprojectare:

"<

for(i=0;i

cout<<"Project"<

cout<

return0;

}

运行结果截图:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 哲学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1