ImageVerifierCode 换一换
格式:DOCX , 页数:37 ,大小:20.55KB ,
资源ID:17727987      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/17727987.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法设计与分析考试复习.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法设计与分析考试复习.docx

1、算法设计与分析考试复习蛮力法1、集合#includeusing namespace std;int pow(int e, int b) int t=1; while(b!=t) e=e*b; t+; return e;void JiHe(int list,int num) int *A=new intnum; /转换为二进制数组 for(int i=0;ipow(2,num);i+) int *B=new intnum; int *A=new intnum; int k=0; int x=i; while(x!=0) int a=x%2; Bk=a; x=(x-a)/2; k+; for(in

2、t j=k;jnum;j+) Bj=0; for(int j=0;jnum;j+) Aj=Bnum-j-1; for(int j=0;jnum;j+) if(Aj=1) coutlistj; coutendl; /输出集合子集 cout空集;int main() int num; cout输入集合的个数num; cout输入集合endl; int *list=new intnum; for(int i=0;ilisti; JiHe(list,num); return 0;2、排列#includeusing namespace std;void Perm(int aa,int k,int m)

3、if(k=m) for(int i=0;i=m;i+) coutaai ; coutendl; else for(int j=k;j=m;j+) swap(aak,aaj); Perm(aa,k+1,m); swap(aak,aaj); int main() int aa=1,2,3,4; Perm(aa,0,3);分治策略3、半整数集问题#includeusing namespace std;int comp(int n)/n的半数集 int ans=1; if(n1) for(int i=1;i=n/2;i+) ans+=comp(i); return ans;int main() int

4、 n=6; coutcomp(n); return 0;4、输油管道问题#includeusing namespace std;int main() int n; int x; int a1000; cinn; for(int k=0;kxak; sort(a,a+n); int min=0; for(int i=0;ian/2) min+=(int)(ai-an/2); else min+=(int)(an/2-ai); coutminendl;5、选择问题#includeusing namespace std;int a10=1,2,4,6,8,9,3,4,5,7;/对于给定的包含n个元素

5、的数组,从中找出第k小的int select(int left,int right,int k) if(left=right)return(aleft); int i=left; int j=right+1; /把最左边的数据当做分界值 int pivot=aleft; /把左边privot的与右边privot的交换 while(true) do i=i+1; while(aipivot); if(i=j)break; swap(ai,aj); if(j-left+1=k)return pivot; aleft=aj; aj=pivot; if(j-left+1k) return select

6、(j+1,right,k-j+left-1); else return select(left,j-1,k);int main() int k=select(0,9,2); coutk; return 0;6、循环赛日程表#includeusing namespace std;/实现方阵的拷贝/行列数为n/2int a100100;void Copy(int k) int n=2;/k=0两个参赛选手日程可以直接求得 a11=1;a12=2; a21=2;a22=1; for(int t=1;tk;t+)/迭代处理,依次处理2n.2k个选手的比赛日程 int temp=n; n=n*2; /填

7、左下角元素 for(int i=temp+1;i=n;i+) for(int j=1;j=temp;j+) aij=ai-tempj+temp; /左下角元素和左上角元素的对应关系 /填右上角元素 for(int i=1;i=temp;i+) for(int j=temp+1;j=n;j+) aij=ai+temp(j+temp)%n; /填右下角 for(int i=temp+1;i=n;i+) for(int j=temp+1;j=n;j+) aij=ai-tempj-temp; for(int i=1;i=n;i+) for(int j=1;j=n;j+) coutaij; if(j=n

8、) coutendl; int main() int k; cout球员为2的k次方,输入kk; if(k!=0) Copy(k); return 0;7、整数因子分解问题#includeusing namespace std;int total;int solve(int n) if(n=1)total+; else for(int i=2;i=n;i+) if(n%i=0)solve(n/i); return total;int main() int n; cout输入整数n; total=0; coutsolve(n); return 0;8、最大子段和问题#includeusing n

9、amespace std;/序列中全为负数,最大字段和为0int MaxSum(int a,int left,int right) int sum=0; int center=0; int leftsum=0; int rightsum=0; if(left=right) if(aleft0) sum=aleft; else sum=0; else center=(left+right)/2; leftsum=MaxSum(a,left,center); rightsum=MaxSum(a,center+1,right); int s1=0;int lefts=0; for(int i=cen

10、ter;i=left;i-) lefts+=ai; if(leftss1)s1=lefts; int s2=0;int rights=0; for(int i=center+1;is2)s2=rights; sum=s1+s2; if(sumleftsum)sum=leftsum; if(sumrightsum)sum=rightsum; return sum;int main() int a=1,2,3,4,5,-6; coutMaxSum(a,0,5);动态规划9、0-1背包问题#includeusing namespace std;const int num=50;/物品数量的上限con

11、st int cap=1500;int wnum=0,2,1,3,2;int vnum=0,12,10,20,15;int pnumcap;/n是物品的数量,c是背包的容量wvoid knapsack(int c,int n) int jmax=min(wn-1,c); for(int j=0;j=jmax;j+) pnj=0; for(int j=wn;j=1;i-) jmax=min(wi-1,c); for(int j=0;j=jmax;j+) pij=pi+1j; for(int j=wi;j=w1) p1c=max(p1c,p2c-w1+v1);int main()knapsack(

12、5,5);coutp15;10、矩阵连乘积问题#include#define num 51using namespace std;int p=50,10,40,30,5,20,15;int mnumnum;int snumnum;void MatrixChain(int n)/n是矩阵的个数 for(int i=1;i=n;i+) mii=0; for(int r=2;r=n;r+)/r是指对角线 for( int i=1;i=n-r+1;i+) int j=i+r-1; /计算初值,从i处断开 mij=mi+1j+pi-1*pi*pj; sij=i; for(int k=i+1;kj;k+)

13、 int t=mik+mk+1j+pi-1*pk*pj; if(tmij) mij=t; sij=k; void TraceBack(int i,int j) if(i=j) coutAi; else cout(; TraceBack(i,sij); TraceBack(sij+1,j); cout); int main() int n=6; MatrixChain(n); TraceBack(1,n);11、最长单调递增子序列#includeusing namespace std;const int num=100;int anum=0,65,158,170,155,239,300,207,

14、389;int LIS(int n) int bnum=0; b1=1;/以bi为结尾的最长单调子序列的个数 int max=0; for(int i=2;i=n;i+) int k=0; for(int j=1;ji;j+) if(aj=ai&kbj) k=bj; bi=k+1; if(maxbi) max=bi; return max;int main() coutLIS(8);12、最长公共子序列问题#includeusing namespace std;const int num=100;int cnumnum;int bnumnum;void LCSLength(int m,int

15、n,const char x,char y) for(int i=1;i=m;i+)ci0=0; for(int i=1;i=n;i+)c0i=0; /根据递推公式构造数组c for(int i=1;i=m;i+) for(int j=1;j=cij-1) cij=ci-1j; bij=2; else cij=cij-1; bij=3; void LCS(int i,int j,char x) if(i=0|j=0)return; if(bij=1) LCS(i-1,j-1,x); coutxi; else if(bij=2) LCS(i-1,j,x); else LCS(i,j-1,x);i

16、nt main() char x=A,B,C,B,D,A,B; char y=B,D,C,A,B,A; LCSLength(8,7,x,y); LCS(8,7,x);贪心法13、背包问题#includeusing namespace std;struct bag int w; int v; double c;bool cmp(bag a,bag b) return a.c=b.c;/n是物品数量,c是书包容量,a是按性比价排列的double knapsack(int n,bag a,double c) sort(a,a+n,cmp); double cleft =c; int i=0; dou

17、ble b=0;/获得的价值 /当背包还能完全装下物品i while (in&ai.wcleft) cleft-=ai.w; b+=ai.v; i+; if(in)b+=1*ai.v*cleft/ai.w; return b;int main() bag a15=10,60,6,30,120,4,20,100,5; coutknapsack(3,a,50); return 0;14、多出最优服务次序问题#include#include using namespace std;double greedy(vector client,int s)/顾客等待队列为client 窗口数量为s vect

18、or service(s+1,0); vector sum(s+1,0); int n=client.size(); sort(client.begin(),client.end(); int i=0; int j=0; while(in) servicej+=clienti; sumj+=servicej; +i;+j; if(j=s)j=0; double t=0; for(i=0;is;+i) t+=sumi; t/=n; return t;int main() cout有n个顾客,s个窗口提供服务,请输入n和sn; cins; cout输入顾客需要的时间clientendl; vect

19、or client; int temp; for(int i=0;itemp; client.push_back(temp); coutgreedy(client,s);15、活动安排问题#includeusing namespace std;struct action int s; int f; int index;bool cmp(const action &a,const action &b) if(a.f=b.f)return true; return false;void GreedySelector(int n,action a,bool b) sort(a,a+n+1,cmp);

20、 b1=true; int preEnd =1; for(int i=2;i=apreEnd.f) bi=true; preEnd=i; for(int i=1;i=n;i+) if(bi) coutai.indexendl; int main() action a12=0,0,0,1,4,1,3,5,2,0,6,3,5,7,4,3,8,5,5,9,6,6,10,7,8,11,8,8,12,9,2,13,10,12,14,11; bool b12=false; GreedySelector(11,a,b);16、删除问题#includeusing namespace std;void f(st

21、ring a,int k) if(k=a.size() a.erase(); else while(k0) int i; for(i=0;(ia.size()-1)&(ai1&a0=0) a.erase(0,1); coutaendl;int main() string a=123435; int k=1; f(a,k);17、数字三角形问题#includeusing namespace std;const int num=5;int trinumnum=9,12,15,10,6,8,2,18,9,5,19,7,10,4,16;int triangle(int n) int i,j; for(

22、i=n-2;i=0;i-) for(j=0;jtrii+1j+1) triij+=trii+1j; else triij+=trii+1j+1; return tri00;int main() couttriangle(6);18、最优装载问题#includeusing namespace std;/容量一定,装载的个数最多,则优先装载轻的;struct load int w;/重量 int index;/编号;bool cmp(load a,load b) if(a.wc) coutno anser!endl; int i; for(i=0;i=n&ai.w=c;i+) xai.index=1; c-=ai.w; coutiendl; for(i=1;i=n;i+) if(xi=1) couti ; int main() load a=40,1,10,2,40,3; Loading(4,a,50);回溯法19、0-1背包问题#includeusing namespace std;const int num=100;int c;/背包容量int n;/物品数量int cw;/当前重量int cv;/当前价值int bestv;/当前最优价值s

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

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