算法设计与分析实验报告班级:计科0902班姓名:张华敏学号:0909090814矩阵连乘问题一,实验内容:二,写一个完整的代码来完整的实现矩阵连乘问题。
三,算法设计:在矩阵连乘问题中,根据老师所讲和自己看书对动态规划方法的理解,通过最优子结构性质。
再结合书上的算法,便可顺利的写出了代码四,遇到的问题及解决方案:只根据算法写出具体的实现过程刚开始觉得很难,觉得无从下手,不知道该用什么结构形式来存放各个参数,也不知道该怎样具体的实施算法的细节,但是课本上给出了一段实现代码给了我很大的启发,通过借鉴树上的代码实现再结合自己的努力,才终于完成了矩阵连乘全部的代码实现,包括最少连乘次数以及剖分方法。
五,源代码package suanfa;public class Juzhen {public void matrixchain(int p[],int m[][],int s[][]){i nt n=p.length-1;f or(int i=1;i<=n;i++){m[i][i]=0;}f or(int r=2;r<=n;r++){for(int i=1;i<=n-r+1;i++){int j=i+r-1;m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];s[i][j]=i;for(int k=i+1;k<j;k++){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;}}} }}public static void main(String[] args) {int p[]={50,10,40,30,5};int m[][]=new int[5][5];int s[][]=new int[5][5];Juzhen a=new Juzhen();a.matrixchain(p,m, s);//a.traceback(s,1,4);System.out.println("最少数乘次数:"+m[1][4]);}}五,测试结果:背包问题一,实验内容:二,写一个完整的代码来完整的实现背包问题。
三,算法设计:贪心算法,首先算出每个货物单位重量的价值,然后进行排序,往背包里种货物时总是先装单位重量价值最大的货物,这样便可得到最优解。
四,遇到的问题及解决方案:种种方法很简单,没有遇见什么问题。
五,源代码package suanfa;public class Beibao {static float w[]=new float[]{5,1,3,4,5};static float p[]=new float[]{4,5,3,2,1};static float capacity=12;static float value=0;public static void sort(){float x;for(int i=0;i<5;i++){for(int j=i+1;j<5;j++){if((p[i]/w[i])<(p[j]/w[j])){x=w[i];w[i]=w[j];w[j]=x;x=p[i];p[i]=p[j];p[j]=x;}}}}public static void main(String[] args) {sort();for(int i=0;i<5;i++){if((capacity!=0)&&(w[i]<=capacity)){value=value+p[i];}if((capacity!=0)&&(capacity<w[i])){value=value+capacity*p[i]/w[i];}capacity=capacity-w[i];}System.out.println(value);}}五,测试结果:最大数最小数一,实验内容:二,写一个完整的代码来完整的实现最大数最小数问题。
三,算法设计:利用分治思想,先将数列分成两组,在每一组中分别求最大数最小数,然后从这两组最大数最小数中选出最大的和最小的,分组后的做法也像上面一样在分成两组,直到把组分成只含两个数。
四,遇到的问题及解决方案:种种方法很简单,没有遇见什么问题。
五,源代码package suanfa;//import java.util.Scanner;public class Maxmin {static int n;static int a[]=new int[]{1,24,3,9,5};static int fmax,fmin;public static int max(int i,int j){int x;int y;int mid;if(i==j){fmax=a[i];return fmax;}if(i==(j-1)){if(a[i]<a[j]){fmax=a[j];}else{fmax=a[i];}return fmax;}mid=(i+j)/2;x=max(i,mid);y=max(mid+1,j);if(x>y) fmax=x;else fmax=y;return fmax;}public static int min(int i,int j){int x;int y;int mid;if(i==j){fmin=a[i];return fmin;}if(i==(j-1)){if(a[i]<a[j]){fmin=a[i];}else{fmin=a[j];}return fmin;}mid=(i+j)/2;x=min(i,mid);y=min(mid+1,j);if(x<y) fmin=x;else fmin=y;return fmin;}public static void main(String[] args) { // TODO Auto-generated method stub//Scanner input=new Scanner(System.in);//int x=input.nextInt();fmax=max(0,4);fmin=min(0,4);System.out.println(fmax);System.out.println(fmin);}}六,测试结果:N皇后问题一,实验内容:写一个完整的代码用递归和非递归两种方式来完整的实现N皇后问题。
二,算法设计:利用回溯法,构造解空间,将所有的可能构成一棵空间状态树。
然后利用递归或非递归的方法来深度优先遍历整棵空间状态树知道找到所有答案把空间状态树遍历完为止,在这个过程中要根据皇后不能同行同列同斜线这一限制来修剪空间状态树。
如果有节点不符合要求则不再向下遍历。
三,遇到的问题及解决方案:递归的方法比较好些,非递归的方法有点难想,但是经过静静的思考最终还是想到的解决的方法。
四,源代码递归算法:package suanfa;public class NQueen {static int n; //皇后个数static int x[]; //当前解static long sum; //当前已找到的可行方案private static boolean place(int k){for(int j=1;j<k;j++)if((Math.abs(k-j)==Math.abs(x[j]-x[k]))||(x[j]==x[k]))return false;return true;}private static void backtrack(int t){ if(t>n){sum++;for(int i=0;i<n+1;i++)System.out.println(x[i]);System.out.println("一种结束");}elsefor(int i=1;i<=n;i++){x[t]=i;if(place(t)) backtrack(t+1);}}public static long input(int nn){n=nn;sum=0;x=new int[n+1];for(int i=0;i<=n;i++) x[i]=0;backtrack(1);return sum;}public static void main(String[] args) { long x;x=input(5);System.out.println(x);}}非递归算法:package suanfa;public class Nhuanghou {static int n; //皇后个数static int x[]; //当前解static long sum; //当前已找到的可行方案private static boolean place(int k){for(int j=1;j<k;j++)if((Math.abs(k-j)==Math.abs(x[j]-x[k]))||(x[j]==x[k])) return false;return true;}private static void backtrack(int t){x[1]=0;int k=1;while(k>0){x[k]++;while((x[k]<=n)&&!(place(k))) x[k]++;if(x[k]<=n){if(k==n) {sum++;for(int i=0;i<n+1;i++)System.out.println(x[i]);System.out.println("一种结束");}else{k++;x[k]=0;}}else k--;}}public static long input(int nn){n=nn;sum=0;x=new int[n+1];for(int i=0;i<=n;i++) x[i]=0;backtrack(1);return sum;}public static void main(String[] args) {// TODO Auto-generated method stublong x;x=input(5);System.out.println(x);}}五,测试结果:装载问题一,实验内容:写一个完整的代码来完整的实现装载问题。
二,算法设计:和贪心算法背包问题一模一样。
三,遇到的问题及解决方案:种种方法很简单,没有遇见什么问题。
四,源代码package suanfa;public class Zhuangzai {static int w[]=new int[]{5,4,3,2,1};static int capacity=10;static int x;static void sort(){for(int i=0;i<5;i++)for(int j=i+1;j<5;j++){if(w[i]>w[j]){x=w[i];w[i]=w[j];w[j]=x;}}}public static void main(String[] args) {// TODO Auto-generated method stubsort();for(int i=0;i<5;i++){if(capacity>=w[i]){capacity=capacity-w[i];System.out.println("重量为"+w[i]+"的集装箱已经装上船");}elseSystem.out.println("重量为"+w[i]+"的集装箱未能装上船");}}}五,测试结果:实验感悟:通过本次不仅增加了我对各个算法的深入理解与实现,更是自己的编程能力获得了很大的提高,面对一个问题时不再显得手忙脚乱无从下手。