算法分析与设计实验报告.docx
- 文档编号:25307564
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:20
- 大小:129.85KB
算法分析与设计实验报告.docx
《算法分析与设计实验报告.docx》由会员分享,可在线阅读,更多相关《算法分析与设计实验报告.docx(20页珍藏版)》请在冰豆网上搜索。
算法分析与设计实验报告
实验一算法实现一
一、实验目的与要求
熟悉C/C++语言的集成开发环境;
通过本实验加深对分治法、贪心算法的理解。
二、实验内容:
掌握分治法、贪心算法的概念和基本思想,并结合具体的问题学习如何用相应策略进行求解的方法。
三、实验题
1.【伪造硬币问题】给你一个装有n个硬币的袋子。
n个硬币中有一个是伪造的。
你的任务是找出这个伪造的硬币。
为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。
试用分治法的思想写出解决问题的算法,并计算其时间复杂度。
importjava.util.Scanner;
importjava.io.*;
publicclasscoin{
publicstaticintCompare(int[]coin,intastart,intbstart,intn)
{
inti,asum=0,bsum=0;
for(i=astart;i asum+=coin[i]; for(i=bstart;i bsum+=coin[i]; if(asum return-1; elseif(asum==bsum) return0; else return1; } publicstaticintFind(intcoin[],intstart,intn) { if(n==1) { System.out.print("假硬币的位置是: "); returnstart; } elseif((n%2)==0) { if(Compare(coin,start,n/2,n/2)==-1) returnFind(coin,start,n/2); elseif(Compare(coin,start,n/2,n/2)==0) return-1; else returnFind(coin,n/2,n/2); } else { if(Compare(coin,start,start+(n-1)/2,(n-1)/2)==-1) returnFind(coin,start,(n-1)/2); elseif(Compare(coin,start,start+(n-1)/2,(n-1)/2)==0) returnFind(coin,start+n-1,1); else returnFind(coin,start+(n-1)/2,(n-1)/2); } } publicstaticvoidmain(String[]args)throwsIOException { intn; Scannerinput=newScanner(System.in); System.out.println("请输入硬币总数n: "); n=input.nextInt(); intcoin[]=newint[n+1]; inti,j; for(i=1;i<=n;i++) coin[i]=1; j=(int)(Math.random()*n);//生成一随机数,来存放假币 coin[j+1]=0; for(i=1;i<=n;i++) System.out.print(""+coin[i]); System.out.print("\n"); System.out.print(""+Find(coin,1,n)); } 2.} 2.【找零钱问题】一个小孩买了价值为33美分的糖,并将1美元的钱交给售货员。 售货员希望用数目最少的硬币找给小孩。 假设提供了数目有限的面值为25美分、10美分、5美分、及1美分的硬币。 给出一种找零钱的贪心算法。 importjava.util.Scanner; importjava.io.*; publicclasszhaoqian{ publicstaticvoidmain(String[]args)throwsIOException { inti,n,m,k,d,money=33; intcount25=0;intcount10=0; intcount5=0;intcount1=0; Scannerinput=newScanner(System.in); System.out.println("请输入拥有的25美分的数目n: "); n=input.nextInt(); intcoin[]=newint[100]; for(i=0;i coin[i]=25; System.out.println("请输入拥有的10美分的数目m: "); Scannerinput1=newScanner(System.in); m=input1.nextInt(); for(i=n;i coin[i]=10; System.out.println("请输入拥有的5美分的数目k: "); Scannerinput2=newScanner(System.in); k=input2.nextInt(); for(i=n+m;i coin[i]=5; System.out.println("请输入拥有的1美分的数目d: "); Scannerinput3=newScanner(System.in); d=input3.nextInt(); for(i=n+m+k;i coin[i]=1; for(i=0;i System.out.print(""+coin[i]); System.out.print("\n"); while((money-=25)>=0&&n>0) count25++; money+=25; while((money-=10)>=0&&m>0) count10++; money+=10; while((money-=5)>=0&&k>0) count5++; money+=5; while((money-=1)>=0&&d>0) count1++; money+=1; if(25*count25+10*count10+5*count5+1*count1<33) System.out.println("不好意思,零钱找不开! "); else { System.out.println("所需要找的25美分的个数为: "+count25); System.out.println("所需要找的10美分的个数为: "+count10); System.out.println("所需要找的5美分的个数为: "+count5); System.out.println("所需要找的1美分的个数为: "+count1); } } } 实验二算法实现二 一、实验目的与要求 熟悉C/C++语言的集成开发环境; 通过本实验加深对贪心算法、动态规划和回溯算法的理解。 二、实验内容: 掌握贪心算法、动态规划和回溯算法的概念和基本思想,分析并掌握"0-1"背包问题的三种算法,并分析其优缺点。 三、实验题 1."0-1"背包问题的贪心算法 importjava.util.*; publicclassbeibao { double[]zhongliang; double[]jiaqian; int[]wupin; ints,h; doublew; publicvoidinput() { System.out.println("请输入物品个数"); Scannerreader=newScanner(System.in); s=reader.nextInt(); zhongliang=newdouble[s]; jiaqian=newdouble[s]; wupin=newint[s]; System.out.println("请输入包的成重量"); Scannerreade=newScanner(System.in); w=reade.nextDouble(); for(inti=0;i { System.out.println("请输入第"+(i+1)+"物品重量"); Scannerreaders=newScanner(System.in); doublea=readers.nextDouble(); zhongliang[i]=a; System.out.println("请输入第"+(i+1)+"物品总价格"); Scannerreaderss=newScanner(System.in); doubleb=readerss.nextDouble(); jiaqian[i]=b/a; wupin[i]=i; } } publicvoidsort() { doublec=0.0d; doubled=100.0d; for(inti=0;i { for(intj=0;j { if(jiaqian[j]>c&&jiaqian[j] { c=jiaqian[j]; h=j; } } wupin[i]=h; d=c; c=0.0d; } } publicvoidtests() { sort(); intx=0; for(inti=0;i { if(zhongliang[wupin[i]]>w) break; w-=zhongliang[wupin[i]]; System.out.println("可装入第"+(wupin[i]+1)+"物品"); x=i+1; } if(x<=(s-1)) { System.out.println("可装入第"+(wupin[x]+1)+"物品的"+(w/zhongliang[wupin[x]])); } } } classtest { publicstaticvoidmain(String[]args) { beibaobaos=newbeibao(); baos.input(); baos.tests(); } } 2."0-1"背包问题的动态规划算法 importjava.util.ArrayList; importjava.util.*; publicclassKnapsack { privateintweight; privateintvalue; publicKnapsack(intweight,intvalue) { this.value=value; this.weight=weight; } publicintgetWeight() { returnweight; } publicvoidsetWeight(intweight) { this.weight=weight; } publicintgetValue() { returnvalue; } publicvoidsetValue(intvalue) { this.value=value; } publicStringtoString() { return"[weight: "+weight+""+"value: "+value+"]"; } } classKnapsackProblem { privateKnapsack[]bags; privateinttotalWeight; privateintn; privateint[][]bestValues; privateintbestValue; privateArrayListbestSolution; publicKnapsackProblem(Knapsack[]bags,inttotalWeight,intn) { this.bags=bags; this.totalWeight=totalWeight; this.n=n; if(bestValues==null) { bestValues=newint[n+1][totalWeight+1]; } if(bestSolution==null) bestSolution=newArrayList(); } publicvoidsolution() { System.out.println("所给定物品为: "); for(Knapsackb: bags) { System.out.println(b); } System.out.println("所要求总承重为: "+totalWeight); //求解最优值 for(intj=0;j<=totalWeight;j++) { for(inti=0;i<=n;i++) { if(i==0||j==0) { bestValues[i][j]=0; } else { if(j { bestValues[i][j]=bestValues[i-1][j]; } else { intiweight=bags[i-1].getWeight(); intivalue=bags[i-1].getValue(); bestValues[i][j]=Math.max(bestValues[i-1][j],ivalue+bestValues[i-1][j-iweight]); } } } } //求解背包组成 inttempWeight=totalWeight; for(inti=n;i>=1;i--) { if(bestValues[i][tempWeight]>bestValues[i-1][tempWeight]) { bestSolution.add(bags[i-1]); tempWeight=totalWeight-bags[i-1].getWeight(); } } } publicintgetBestValue() { bestValue=bestValues[n][totalWeight]; returnbestValue; } publicint[][]getBestValues() { returnbestValues; } publicArrayListgetBestSolution() { returnbestSolution; } } classTestKnapsack { publicstaticvoidmain(String[]args) { System.out.println("请输入物品个数"); Scannerreader=newScanner(System.in); ints=reader.nextInt(); intjiage[]=newint[s]; intzhongliang[]=newint[s]; System.out.println("请输入包的成重量"); Scannerreade=newScanner(System.in); inttotalWeight=reade.nextInt(); for(inti=0;i { System.out.println("请输入第"+(i+1)+"物品重量"); Scannerreaders=newScanner(System.in); zhongliang[i]=readers.nextInt(); System.out.println("请输入第"+(i+1)+"物品总价格"); Scannerreaderss=newScanner(System.in); jiage[i]=readerss.nextInt(); } Knapsack[]bags=newKnapsack[] { newKnapsack(zhongliang[0],jiage[0]), newKnapsack(zhongliang[1],jiage[1]), newKnapsack(zhongliang[2],jiage[2]), newKnapsack(zhongliang[3],jiage[3]) }; intn=bags.length; KnapsackProblemkp=newKnapsackProblem(bags,totalWeight,n); kp.solution(); System.out.println("最优值为: "+kp.getBestValue()); System.out.println("最优解——选取的背包为: "); System.out.println(kp.getBestSolution()); System.out.println("最优值矩阵"); int[][]bestValues=kp.getBestValues(); for(inti=0;i { for(intj=0;j { System.out.printf("%-5d",bestValues[i][j]); } System.out.println(); } } } 3."0-1"背包问题的回溯算法 importjava.util.*; publicclassKnapsack { privatedouble[]p,w;//分别代表价值和重量 privateintn; privatedoublec,bestp,cp,cw; privateintx[];//记录可选的物品 privateint[]cx; publicKnapsack(doublepp[],doublezhongliang[],doublejiage){ this.p=pp;this.w=zhongliang;this.n=pp.length-1; this.c=jiage;this.cp=0;this.cw=0; this.bestp=0; x=newint[zhongliang.length]; cx=newint[pp.length]; } voidknapsack(){ backtrack(0); } voidbacktrack(inti){ if(i>n){//判断是否到达了叶子节点 if(cp>bestp){ for(intj=0;j x[j]=cx[j]; bestp=cp; } return; } if(cw+w[i]<=c){//搜索右子树 cx[i]=1; cw+=w[i]; cp+=p[i]; backtrack(i+1); cw-=w[i]; cp-=p[i]; } cx[i]=0; backtrack(i+1);//检查左子树 } voidprintResult(){ System.out.println("回溯法"); System.out.println("物品个数: n=5"); System.out.println("背包容量: c=10"); System.out.println("物品重量数组: zhongliang={2,2,6,5,4}"); System.out.println("物品价值数组: jiage={6,3,5,4,6}"); System.out.println("最优值: ="+bestp); System.out.println("选中的物品是: "); for(inti=0;i System.out.print(x[i]+""); } } publicstaticvoidmain(String[]args){ doublep[]={6,3,5,4,6}; doublew[]={2,2,6,5,4}; intmaxweight=10; Knapsackks=newKnapsack(p,w,maxweight); ks.knapsack();//回溯搜索 ks.printResult(); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 分析 设计 实验 报告