算法设计与分析考试复习.docx
- 文档编号:17727987
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:37
- 大小:20.55KB
算法设计与分析考试复习.docx
《算法设计与分析考试复习.docx》由会员分享,可在线阅读,更多相关《算法设计与分析考试复习.docx(37页珍藏版)》请在冰豆网上搜索。
算法设计与分析考试复习
蛮力法
1、集合
#include
usingnamespacestd;
intpow(inte,intb)
{
intt=1;
while(b!
=t)
{
e=e*b;
t++;
}
returne;
}
voidJiHe(intlist[],intnum)
{
int*A=newint[num];
//转换为二进制数组
for(inti=0;i { int*B=newint[num]; int*A=newint[num]; intk=0; intx=i; while(x! =0) { inta=x%2; B[k]=a; x=(x-a)/2; k++; } for(intj=k;j { B[j]=0; } for(intj=0;j { A[j]=B[num-j-1]; } for(intj=0;j { if(A[j]==1) { cout< } } cout< } //输出集合子集 cout<<"空集"; }; intmain() { intnum; cout<<"输入集合的个数"< cin>>num; cout<<"输入集合"< int*list=newint[num]; for(inti=0;i { cin>>list[i]; } JiHe(list,num); return0; } 2、排列 #include usingnamespacestd; voidPerm(intaa[],intk,intm) { if(k==m) { for(inti=0;i<=m;i++) cout< cout< } else { for(intj=k;j<=m;j++) { swap(aa[k],aa[j]); Perm(aa,k+1,m); swap(aa[k],aa[j]); } } } intmain() { intaa[]={1,2,3,4}; Perm(aa,0,3); } 分治策略 3、半整数集问题 #include usingnamespacestd; intcomp(intn)//n的半数集 { intans=1; if(n>1) for(inti=1;i<=n/2;i++) ans+=comp(i); returnans; } intmain() { intn=6; cout< return0; } 4、输油管道问题 #include usingnamespacestd; intmain() { intn; intx; inta[1000]; cin>>n; for(intk=0;k cin>>x>>a[k]; sort(a,a+n); intmin=0; for(inti=0;i { if(a[i]>a[n/2]) min+=(int)(a[i]-a[n/2]); elsemin+=(int)(a[n/2]-a[i]); } cout< } 5、选择问题 #include usingnamespacestd; inta[10]={1,2,4,6,8,9,3,4,5,7}; //对于给定的包含n个元素的数组,从中找出第k小的 intselect(intleft,intright,intk) { if(left>=right)return(a[left]); inti=left; intj=right+1; //把最左边的数据当做分界值 intpivot=a[left]; //把左边>privot的与右边 while(true) { do { i=i+1; }while(a[i] do { j=j-1; }while(a[j]>pivot); if(i>=j)break; swap(a[i],a[j]); } if(j-left+1==k)returnpivot; a[left]=a[j]; a[j]=pivot; if(j-left+1 returnselect(j+1,right,k-j+left-1); elsereturnselect(left,j-1,k); } intmain() { intk=select(0,9,2); cout< return0; } 6、循环赛日程表 #include usingnamespacestd; //实现方阵的拷贝 //行列数为n/2 inta[100][100]; voidCopy(intk) { intn=2;//k=0两个参赛选手日程可以直接求得 a[1][1]=1;a[1][2]=2; a[2][1]=2;a[2][2]=1; for(intt=1;t { inttemp=n; n=n*2; //填左下角元素 for(inti=temp+1;i<=n;i++) { for(intj=1;j<=temp;j++) a[i][j]=a[i-temp][j]+temp; //左下角元素和左上角元素的对应关系 } //填右上角元素 for(inti=1;i<=temp;i++) { for(intj=temp+1;j<=n;j++) a[i][j]=a[i+temp][(j+temp)%n]; } //填右下角 for(inti=temp+1;i<=n;i++) { for(intj=temp+1;j<=n;j++) a[i][j]=a[i-temp][j-temp]; } } for(inti=1;i<=n;i++) for(intj=1;j<=n;j++) { cout< if(j==n) cout< } } intmain() { intk; cout<<"球员为2的k次方,输入k"< cin>>k; if(k! =0) Copy(k); return0; } 7、整数因子分解问题 #include usingnamespacestd; inttotal; intsolve(intn) { if(n==1)total++; elsefor(inti=2;i<=n;i++) if(n%i==0)solve(n/i); returntotal; } intmain() { intn; cout<<"输入整数"< cin>>n; total=0; cout< return0; } 8、最大子段和问题 #include usingnamespacestd; //序列中全为负数,最大字段和为0 intMaxSum(inta[],intleft,intright) { intsum=0; intcenter=0; intleftsum=0; intrightsum=0; if(left==right) { if(a[left]>0) sum=a[left]; elsesum=0; } else { center=(left+right)/2; leftsum=MaxSum(a,left,center); rightsum=MaxSum(a,center+1,right); } ints1=0;intlefts=0; for(inti=center;i>=left;i--) { lefts+=a[i]; if(lefts>s1)s1=lefts; } ints2=0;intrights=0; for(inti=center+1;i<=right;i++) { rights+=a[i]; if(rights>s2)s2=rights; } sum=s1+s2; if(sum if(sum returnsum; } intmain() { inta[]={1,2,3,4,5,-6}; cout< } 动态规划 9、0-1背包问题 #include usingnamespacestd; constintnum=50;//物品数量的上限 constintcap=1500; intw[num]={0,2,1,3,2}; intv[num]={0,12,10,20,15}; intp[num][cap]; //n是物品的数量,c是背包的容量w voidknapsack(intc,intn) { intjmax=min(w[n]-1,c); for(intj=0;j<=jmax;j++) p[n][j]=0; for(intj=w[n];j<=c;j++) p[n][j]=v[n]; for(inti=n-1;i>=1;i--) { jmax=min(w[i]-1,c); for(intj=0;j<=jmax;j++) p[i][j]=p[i+1][j]; for(intj=w[i];j<=c;j++) p[i][j]=max(p[i+1][j],p[i+1][j-w[i]]+v[i]); } p[1][c]=p[2][c]; if(c>=w[1]) p[1][c]=max(p[1][c],p[2][c-w[1]]+v[1]); } intmain() { knapsack(5,5); cout< } 10、矩阵连乘积问题 #include #definenum51 usingnamespacestd; intp[]={50,10,40,30,5,20,15}; intm[num][num]; ints[num][num]; voidMatrixChain(intn)//n是矩阵的个数 { for(inti=1;i<=n;i++) m[i][i]=0; for(intr=2;r<=n;r++)//r是指对角线 for(inti=1;i<=n-r+1;i++) { intj=i+r-1; //计算初值,从i处断开 m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j]; s[i][j]=i; for(intk=i+1;k { intt=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]; if(t { m[i][j]=t; s[i][j]=k; } } } } voidTraceBack(inti,intj) { if(i==j) cout<<"A"< else { cout<<"("; TraceBack(i,s[i][j]); TraceBack(s[i][j]+1,j); cout<<")"; } } intmain() { intn=6; MatrixChain(n); TraceBack(1,n); } 11、最长单调递增子序列 #include usingnamespacestd; constintnum=100; inta[num]={0,65,158,170,155,239,300,207,389}; intLIS(intn) { intb[num]={0}; b[1]=1;//以b[i]为结尾的最长单调子序列的个数 intmax=0; for(inti=2;i<=n;i++) { intk=0; for(intj=1;j if(a[j]<=a[i]&&k k=b[j]; b[i]=k+1; if(max max=b[i]; } returnmax; } intmain() { cout< } 12、最长公共子序列问题 #include usingnamespacestd; constintnum=100; intc[num][num]; intb[num][num]; voidLCSLength(intm,intn,constcharx[],chary[]) { for(inti=1;i<=m;i++)c[i][0]=0; for(inti=1;i<=n;i++)c[0][i]=0; //根据递推公式构造数组c for(inti=1;i<=m;i++) for(intj=1;j<=n;j++) { if(x[i]==y[i]) { c[i][j]=c[i-1][j-1]+1; b[i][j]=1; } elseif(c[i-1][j]>=c[i][j-1]) { c[i][j]=c[i-1][j]; b[i][j]=2; } else { c[i][j]=c[i][j-1]; b[i][j]=3; } } } voidLCS(inti,intj,charx[]) { if(i==0||j==0)return; if(b[i][j]==1) { LCS(i-1,j-1,x); cout< } elseif(b[i][j]==2) LCS(i-1,j,x); elseLCS(i,j-1,x); } intmain() { charx[]={'A','B','C','B','D','A','B'}; chary[]={'B','D','C','A','B','A'}; LCSLength(8,7,x,y); LCS(8,7,x); } 贪心法 13、背包问题 #include usingnamespacestd; structbag { intw; intv; doublec; }; boolcmp(baga,bagb) { returna.c>=b.c; } //n是物品数量,c是书包容量,a是按性比价排列的 doubleknapsack(intn,baga[],doublec) { sort(a,a+n,cmp); doublecleft=c; inti=0; doubleb=0;//获得的价值 //当背包还能完全装下物品i while(i { cleft-=a[i].w; b+=a[i].v; i++; } if(i returnb; } intmain() { baga[15]={{10,60,6},{30,120,4},{20,100,5}}; cout< return0; } 14、多出最优服务次序问题 #include #include usingnamespacestd; doublegreedy(vector { vector vector intn=client.size(); sort(client.begin(),client.end()); inti=0; intj=0; while(i { service[j]+=client[i]; sum[j]+=service[j]; ++i;++j; if(j==s)j=0; } doublet=0; for(i=0;i t+=sum[i]; t/=n; returnt; } intmain() { cout<<"有n个顾客,s个窗口提供服务,请输入n和s"< intn; ints; cin>>n; cin>>s; cout<<"输入顾客需要的时间client"< vector inttemp; for(inti=0;i { cin>>temp; client.push_back(temp); } cout< } 15、活动安排问题 #include usingnamespacestd; structaction { ints; intf; intindex; }; boolcmp(constaction&a,constaction&b) { if(a.f<=b.f)returntrue; returnfalse; } voidGreedySelector(intn,actiona[],boolb[]) { sort(a,a+n+1,cmp); b[1]=true; intpreEnd=1; for(inti=2;i<=n;i++) if(a[i].s>=a[preEnd].f) { b[i]=true; preEnd=i; } for(inti=1;i<=n;i++) { if(b[i])
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 分析 考试 复习
![提示](https://static.bdocx.com/images/bang_tan.gif)