计算机算法设计与分析课程设计常规题目的(C及C++)代码集
计算机算法设计与分析课程设计
计算机算法设计与分析课程设计成绩评定表课程设计任务书算法分析是对一个算法需要多少计算时间和存储空间作定量的分析。
算法(Algorithm)是解题的步骤,可以把算法定义成解一确定类问题的任意一种特殊的方法。
在计算机科学中,算法要用计算机算法语言描述,算法代表用计算机解一类问题的精确、有效的方法。
分治法字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
在一个2^k*2^k的棋盘上,恰有一个放歌与其他方格不同,且称该棋盘为特殊棋盘。
回溯法的基本做法是深度优先搜索,是一种组织得井井有条的、能避免不必要重复搜索的穷举式搜索算法。
数字拆分问题是指将一个整数划分为多个整数之和的问题。
利用回溯法可以很好地解决数字拆分问题。
将数字拆分然后回溯,从未解决问题。
关键词:分治法,回溯法,棋盘覆盖,数字拆分1分治法解决期盼覆问题 (1)1.1问题描述 (1)1.2问题分析 (1)1.3算法设计 (1)1.4算法实现 (2)1.5结果分析 (3)1.6算法分析 (4)2回溯法解决数字拆分问题 (6)2.1问题描述 (6)2.2问题分析 (6)2.3算法设计 (7)2.4算法实现 (7)2.5结果分析 (8)参考文献 (9)1分治法解决期盼覆问题1.1问题描述在一个2k×2k(k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格。
显然,特殊方格在棋盘中出现的位置有4k中情形,因而有4k中不同的棋盘,图(a)所示是k=2时16种棋盘中的一个。
棋盘覆盖问题要求用图(b)所示的4中不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且热河亮哥L型骨牌不得重复覆盖1.2问题分析用分治策略,可以设计解决棋盘问题的一个简介算法。
当k>0时,可以将2^k*2^k棋盘分割为4个2^k-1*2^k-1子棋盘。
(完整版)常用算法经典代码(C++版)
一、快速排序void qsort(int x,int y) //待排序的数据存放在a[1]..a[n]数组中{int h=x,r=y;int m=a[(x+y)>>1]; //取中间的那个位置的值while(h<r){while (a[h]<m) h++; //比中间那个位置的值小,循环直到找一个比中间那个值大的while (a[r]>m) r--; //比中间那个位置的值大,循环直到找一个比中间那个值小的if(h<=r){int temp=a[h];//如果此时h<=r,交换a[h]和a[r]a[h]=a[r];a[r]=temp;h++;r--; //这两句必不可少哦}}if(r>x) qsort(x,r);//注意此处,尾指针跑到前半部分了if(h<y) qsort(h,y); //注意此处,头指针跑到后半部分了}调用:qsort(1,n)即可实现数组a中元素有序。
适用于n比较大的排序二、冒泡排序void paopao(void) //待排序的数据存放在a[1]..a[n]数组中{for(int i=1;i<n;i++) //控制循环(冒泡)的次数,n个数,需要n-1次冒泡for(int j=1;j<=n-i;j++) //相邻的两两比较if(a[j]<a[j+1]) {int temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}或者void paopao(void) //待排序的数据存放在a[1]..a[n]数组中{for(int i=1;i<n;i++) //控制循环(冒泡)的次数,n个数,需要n-1次冒泡for(int j=n-i;j>=1;j--) //相邻的两两比较if(a[j]<a[j+1]) {int temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}调用:paopao(),适用于n比较小的排序三、桶排序void bucketsort(void)//a的取值范围已知。
算法设计的原代码【精品文档】(完整版)
【例1.4】/*求整数a,b的最大公约数(a,b)*/#include<stdio.h>void main(){ long a,b,c,r;printf("请输入整数a,b: ");scanf("%ld,%ld",&a,&b); /*输入整数a,b */ printf("(%ld,%ld)",a,b);if(a<b){c=a;a=b;b=c;} /*交换a,b,确保a>b*/ r=a%b;while(r!=0){a=b;b=r; /*实施"辗转相除" */ r=a%b;}printf("=%ld\n",b); /*输出求解结果*/ }/*求n个整数的最大公约数*/#include<stdio.h>void main(){ int k,n;long a,b,c,r,m[100];printf("请输入整数个数n: "); /*输入原始数据*/ scanf("%d",&n);printf("请依次输入%d个整数: ",n);for(k=0;k<=n−1;k++){ printf("\n请输入第%d个整数: ",k+1);scanf("%ld",&m[k]);}b=m[0];for(k=1;k<=n−1;k++) /*控制应用n−1次欧几里德算法*/ {a=m[k];if(a<b){c=a;a=b;b=c;} /*交换a,b,确保a>b*/r=a%b;while(r!=0){ a=b;b=r; /*实施"辗转相除" */r=a%b;}}printf("(%ld",m[0]); /*输出求解结果*/for(k=1;k<=n−1;k++)printf(",%ld",m[k]);printf(")=%ld\n",b);}【例2.1】#include <stdio.h>void main(){ long a,b,k,t;printf("请输入正整数a,b:");scanf("%ld,%ld",&a,&b);if(a<b){t=a;a=b;b=t;}for(k=b;k>=1;k--) /*实施穷举*/if(a%k==0 && b%k==0) /*实施判别*/{printf("(%ld,%ld)=%ld \n",a,b,k);printf("{%ld,%ld}=%ld \n",a,b,a*b/k);break; /*输出后须立即退出循环*/}}(3)求最小公倍数穷举设计#include <stdio.h>void main(){ long a,b,k,t;printf("请输入正整数a,b:");scanf("%ld,%ld",&a,&b);if(a<b){t=a;a=b;b=t;}for(k=a;k<=a*b;k=k+a) /*实施穷举*/if(k%a==0 && k%b==0) /*实施判别*/{printf("{%ld,%ld}=%ld \n",a,b,k);printf("(%ld,%ld)=%ld \n",a,b,a*b/k);break; /*输出后须立即退出循环*/ }}【例2.2】/*求分母为[a,b]的最简真分数的增序列*/#include <stdio.h>void main(){int a,b,k,n,i,j,h,t,u,c[3000],d[3000];printf("请依次输入a,b,k:");scanf("%d,%d,%d",&a,&b,&k); /*输入区间的上下限与指定序号k */ n=0;for(j=a;j<=b;j++){for(i=1;i<=j-1;i++){for(t=0,u=2;u<=i;u++)if(j%u==0 && i%u==0) {t=1;break;} /*分子分母有公因数舍去*/ if(t==0) {n++;c[n]=i;d[n]=j;}}}for(i=1;i<=n-1;i++) /*应用冒泡法排序*/for(j=1;j<=n-i;j++)if(c[j]*d[j+1]>c[j+1]*d[j]){h=c[j];c[j]=c[j+1];c[j+1]=h; /*排序分子分母同时交换*/h=d[j];d[j]=d[j+1];d[j+1]=h;}printf("n=%d \n",n);printf("第%d项为:%d/%d \n",k,c[k],d[k]);}【例2.3】/* 2x+3y按项的大小循环设计*/#include <stdio.h>void main(){int n,t,k,i,h,j,a[30000];printf("请输入n: "); scanf("%d",&n);a[1]=1;a[2]=2;t=2;for(k=3;k<=10000;k++){h=0;for(i=2;i<=t;i++){for(j=1;j<=i-1;j++)if(k==2*a[j]+3*a[i] || k==2*a[i]+3*a[j]) /*判断k为递推项*/{h=1;t++;a[t]=k;if(k==2*a[j]+3*a[i]){printf("%3d(%3d)=2*%2d+3*%2d ",k,t,a[j],a[i]);break;}if(k==2*a[i]+3*a[j]){printf("%3d(%3d)=2*%2d+3*%2d ",k,t,a[i],a[j]);break;}}if(h==1) break;}if(t==n) break;}}(4)按项数循环设计程序实现#include <stdio.h>void main(){int n,t,k,i,h,j,a[30000];printf("请输入n: "); scanf("%d",&n);a[1]=1;a[2]=2;k=2;for(t=3;t<=n;t++){k++;h=0;for(i=2;i<=t-1;i++){for(j=1;j<=i-1;j++)if(k==2*a[j]+3*a[i] || k==2*a[i]+3*a[j]) /*判断k为递推项*/{h=1;a[t]=k;if(k==2*a[j]+3*a[i]){printf("%3d(%3d)=2*%2d+3*%2d ",k,t,a[j],a[i]);break;}if(k==2*a[i]+3*a[j]){printf("%3d(%3d)=2*%2d+3*%2d ",k,t,a[i],a[j]);break;}}if(h==1) break;}if(h==0) t--;}}【例2.4】#include <stdio.h>#include <math.h>void main(){long int a,b,x,y;printf("6位分段和平方数有: ");for(a=100000;a<=999999;a++) /*设置a穷举所有6位数*/{b=sqrt(a);if(a==b*b) /*若a是一个平方数则进行分解*/ {x=a/1000; y=a%1000; /* 6位数a分为前后两个3位数*/ if(b==x+y) /*分段和条件检验*/printf("%ld ",a);}}}(2)对3位数穷举#include <stdio.h>#include <math.h>void main(){long int a,b,t,x,y;printf("6位分段和平方数有: ");t=sqrt(100000);for(b=t+1;b<=999;b++) /*设置b穷举所有三位数*/{a=b*b;x=a/1000; y=a%1000; /* 6位平方数a分为前后两个3位数*/if(b==(x+y)) /*分段和条件检验*/printf("%ld ",a);}}【例2.5】/*质因数分解乘积形式*/#include <stdio.h>#include <math.h>void main(){ long int b,k,n;printf("整数n分解质因数.请输入n:");scanf("%ld",&n);printf("%ld=",n);b=n;k=2;while(k<=sqrt(n)) /* k为试商因数,终值取为sqrt(n) */ {if(b%k==0){b=b/k;if(b>1){printf("%ld*",k);continue;} /* k为质因数,返回再试*/if(b==1) printf("%ld \n",k);}k++;}if(b>1 && b<n) printf("%ld\n",b); /*输出大于n平方根的因数*/ if(b==n) printf("(素数!)\n"); /* b=n,表示n无质因数*/}【例2.6】/*穷举求解高斯8皇后问题*/#include <stdio.h>#include <math.h>void main(){int s,k,i,j,t,x,f[9],g[9];long a,y;s=0;printf("高斯八后问题的解为:\n");for(a=12345678;a<=87654321;a=a+9) /*步长为9穷举八位数*/{y=a;k=0;for(i=1;i<=8;i++) f[i]=0;while(y>0){x=y%10;f[x]=f[x]+1;y=y/10;k++;g[k]=x;} /*分离各数字,用f数组统计*/for(t=0,i=1;i<=8;i++)if(f[i]!=1) t=1; /*数字1--8出现不为1次,返回*/ if(t==1) continue;for(k=1;k<=7;k++) /*同处在45度角的斜线上,返回*/ for(j=k+1;j<=8;j++)if (fabs(g[j]-g[k])==j-k) t=1;if(t==1) continue;s++; /*输出8皇后问题的解*/printf("%ld ",a);if(s%6==0) printf("\n");}printf("\n s=%d. ",s);}【例2.7】整币兑零求解。
计算机算法设计与分析课程设计常规题目的(C及C++)代码集
合并排序1:#include<iostream>using namespace std;const int N=100;class list{public:int array[N];void input(int a);void merge(int arrayc[],int arrayd[],int l,int m,int r);void mergepass(int arrayx[],int arrayy[],int s);void mergesort(int array1[]);void diaplay(int a);};void list::input(int a){cout<<"Please input shorted array:"<<endl;for(int i=0;i<a;i++)cin>>array[i];}void list::merge(int arrayc[],int arrayd[],int l,int m,int r) {int i=l;int j=m+1;int k=l;while((i<=m)&&(j<=r))if(arrayc[i]<=arrayc[j])arrayd[k++]=arrayc[i++];else arrayd[k++]=arrayc[j++];if(i>m)for(int q=j;q<=r;q++)arrayd[k++]=arrayc[q];elsefor(int q=i;q<=m;q++)arrayd[k++]=arrayc[q];}void list::mergepass(int arrayx[],int arrayy[],int s){int i=0;while(i<=N-2*s){merge(arrayx,arrayy,i,i+s-1,i+2*s-1);i=i+2*s;}if((i+s)<N)merge(arrayx,arrayy,i,i+s-1,N-1);elsefor(int j=i;j<N;j++)arrayy[j]=arrayx[j];}void list::mergesort(int array1[]){int array2[N];int s=1;while(s<N){mergepass(array1,array2,s);s+=s;mergepass(array2,array1,s);s+=s;}}void list::diaplay(int a){for(int i=N-a;i<N;i++)cout<<array[i];}void main(){list f;int a;cout<<"请输入要合并排序的数组大小:(数组最大上限100)"<<endl;cin>>a;f.input(a);f.mergesort (f.array);f.diaplay (a);}合并排序:2#include <iostream>usingnamespace std;void MERGES(int *A,int p,int q,int r) //下标P<=q<r{int n1=q-p+1; //n1:p,q之间的数的个数int n2=r-q; //n2:q以后到r的数的个数int *L=newint [n1+1], //动态申请两个子数组*R=newint [n2+1];int i,j,k;for (i=0;i<n1;i++){L[i]=A[p+i-1];}for (j=0;j<n2;j++){R[j]=A[q+j];}L[n1]=10000; //设置哨兵R[n2]=10000;i=0;j=0;for (k=p-1;k<r;k++){if (L[i]<=R[j]){A[k]=L[i];i=i+1;}else{A[k]=R[j];j=j+1;}}}void MERGESORT(int *A,int p,int r) {if (p<r){int q=(p+r)/2;MERGESORT(A,p,q);MERGESORT(A,q+1,r);MERGES(A,p,q,r);}}void main(){int x,z,p,r;cout<<"请输入数组长度"<<endl;cin>>x;int *A= newint[x];cout<<"请输入数组的元素"<<endl;for(int y=0;y<x;y++){cin>>z;A[y]=z;}cout<<"请输入上下限p,r"<<endl;cin>>p>>r;MERGESORT(A,p,r);cout<<"合并排序后为:"<<endl;for (int m=p;m<=r;m++){cout<<A[m];}delete []A;}合并排序3:#include <iomanip.h>#include <iostream.h> //这个函数将b[0]至b[right-left+1]拷贝到a[left]至a[right] template <class T>void Copy(T a[],T b[],int left,int right){int size=right-left+1;for(int i=0;i<size;i++){a[left++]=b[i];}} //这个函数合并有序数组a[left:i],a[i+1:right]到b,得到新的有序数组b template <class T>void Merge(T a[],T b[],int left,int i,int right){int a1cout=left,//指向第一个数组开头a1end=i,//指向第一个数组结尾a2cout=i+1,//指向第二个数组开头a2end=right,//指向第二个数组结尾bcout=0;//指向b中的元素for(int j=0;j<right-left+1;j++)//执行right-left+1次循环{if(a1cout>a1end){b[bcout++]=a[a2cout++];continue;}//如果第一个数组结束,拷贝第二个数组的元素到bif(a2cout>a2end){b[bcout++]=a[a1cout++];continue;}//如果第二个数组结束,拷贝第一个数组的元素到bif(a[a1cout]<a[a2cout]){b[bcout++]=a[a1cout++];continue;}//如果两个数组都没结束,比较元素大小,把较小的放入belse{b[bcout++]=a[a2cout++];continue;}}} //对数组a[left:right]进行合并排序template <class T>void MergeSort(T a[],int left,int right){T *b=new int[right-left+1];if(left<right){int i=(left+right)/2;//取中点MergeSort(a,left,i);//左半边进行合并排序MergeSort(a,i+1,right);//右半边进行合并排序Merge(a,b,left,i,right);//左右合并到b中Copy(a,b,left,right);//从b拷贝回来}} //from /zhangamxqunint main(){int n;cout<<"how many numbers to sort:";cin>>n;int *a=new int[n];cout<<"input "<<n<<" numbers:";for(int i=0;i<n;i++){cin>>a[i];}MergeSort( a, 0, n-1);for(int j=0;j<n;j++){cout<<setw(5)<<a[j];}return 1;}合并排序4:#include <iostream>using namespace std;void Merge(int a[],int b[],int l,int m,int r) {int i=l,j=m+1,k=l;while ((i<=m)&&(j<=r))if (a[i]<=a[j])b[k++]=a[i++];else b[k++]=a[j++];if (i>m)for(int q=j;q<=r;q++)b[k++]=a[q];elsefor(int q=i;q<=m;q++)b[k++]=a[q];}void Copy(int a[],int b[],int s,int n){for(int i=s;i<=n;i++)a[i]=b[i];}void MergeSort(int a[],int left,int right) {int i;if(left<right){i=(left+right)/2;int b[100];MergeSort(a,left,i);MergeSort(a,i+1,right);Merge(a,b,left,i,right);Copy(a,b,left,right);}}int main(){int a[100];int n,i;cout<<"输入元素个数n:";cin>>n;cout<<"输入一维数组a["<<n<<"]:";for( i=0;i<n;i++)cin>>a[i];MergeSort(a,0,n-1);cout<<"输出排序为:";for ( i=0;i<n;i++)cout<<a[i]<<' ';cout<<endl;return 0;}矩阵相乘1:#include <iostream>#include <stdio.h>using namespace std;int main(){int i, j, k;cout<<"输入二维数组a的行数和二维数组c的行数x:";int x;cin>>x;cout<<"输入二维数组a的列数和二维数组b的行数y:";int y;cin>>y;cout<<"输入二维数组b的列数和二维数组c的行数z:";int z;cin>>z;int **a, **b, **c;a=new int*[x];for(i=0;i<x;i++){a[i]=new int[y];}cout<<"输入二维数组a:"<<endl;for(i=0;i<x;i++){for(j=0;j<y;j++){cin>>a[i][j];}}b=new int*[y];for(i=0;i<y;i++){b[i]=new int [z];}cout<<"输入二维数组b:"<<endl;for(i=0;i<y;i++){for(j=0;j<z;j++){cin>>b[i][j];}}c=new int*[x];for(i=0;i<x;i++){c[i]=new int [z];}cout<<"输入二维数组c:"<<endl;for(i=0;i<x;i++){for(j=0;j<z;j++){c[i][j]=0;}}for(i=0;i<x;i++){for(j=0;j<z;j++){for(k=0;k<y;k++){c[i][j]+=a[i][k]*b[k][j];}}}for(i=0;i<x;i++){for(j=0;j<z;j++){cout<<c[i][j]<<' ';}cout<<endl;}for(i=0;i<x;i++){delete [] a[i];}delete [] a;for(i=0;i<x;i++){delete [] c[i];}delete [] c;for(i=0;i<y;i++){delete [] b[i];}delete [] b;return 0;}矩阵相乘2:#include<iostream>using namespace std;#define M 2#define N 3#define P 4int main(){int a[M][N]={{1,2,3},{4,5,6}};int b[N][P]={{7,8,9,1},{2,3,4,5},{6,7,8,9}};int c[M][P];int i,j,k;for(i=0;i<M;i++)for(j=0;j<P;j++)c[i][j]=0;for(i=0;i<M;i++)for(j=0;j<P;j++)for(k=0;k<N;k++)c[i][j]+=a[i][k]*b[k][j];cout<<"矩阵相乘结果是:"<<endl;for(i=0;i<M;i++){for(j=0;j<P;j++)cout<<c[i][j]<<" ";cout<<endl;}//system("pause");return 0;}矩阵相乘3:#include <iostream>#include <iomanip>using namespace std;int main(){const int m=3;const int n=3;int a[m][n],i,j; //初始化数组a,bfor(i=0;i<m;i++) //对数组 a 赋值并显示{for( j=0;j<n;j++){cout<<"a["<<i<<"]"<<"["<<j<<"]=";cin>>a[i][j];}}for( i=0;i<m;i++){for( j=0;j<n;j++)cout<<setw(4)<<a[i][j];cout<<endl;}const int k=3;const int h=2;int b[k][h],x,y;for( x=0;x<k;x++){for( y=0;y<h;y++){cout<<"b["<<x<<"]"<<"["<<y<<"]=";cin>>b[x][y];}}for( x=0;x<k;x++){for( y=0;y<h;y++)cout<<setw(4)<<b[x][y];cout<<endl;}int c[m][h]; //乘赋值给数组cfor(int r=0;r<m;r++){for(int t=0;t<h;t++) //数组a 与b 相//对数组b 赋值并显示{c[r][t]=0;for(int s=0;s<k;s++){c[r][t]+=a[r][s]*b[s][t];}}}cout<<"c["<<m<<"]"<<"["<<h<<"]"<<endl;for(int z=0;z<m;z++){for(int w=0;w<h;w++)cout<<setw(4)<<c[z][w];cout<<endl;}return 0; //显示数组c}矩阵相乘4:#include<iostream>using namespace std;void chain(int*p,int n,int m[][7],int s[][7])//p维数数组,m最优乘次数组,s记录划分方案{int j;for(int i=1;i<=n;i++)m[i][i]=0;for(int r=2;r<=n;r++){for(i=1;i<=n-r+1;i++){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;}}}}for(i=1;i<=n;i++)//我把它翻过来输出。
C++课程设计题目和代码
课程设计报告一、代码A1输出10至99之间每位数的乘积大于每位数的和的数,例如对于数字12,有1*2<1+2,故不输出该数;对于27,有2*7>2+7,故输出该数。
#include "stdafx.h"#include<iostream>using namespace std;int main(int argc, char* argv[]){int tens;int units;int count = 0;cout<<"输出10至99之间每位数的乘积大于每位数的和的数,例如对于数字12,有1*2<1+2,故不输出该数;对于27,有2*7>2+7,故输出该数。
\n如下:\n";for (int i = 10; i < 100; i++) {tens = i / 10;units = i % 10;if ((tens * units) > (tens + units)) {cout<<i<<" ";count++;if (count % 10 == 0) {cout<<"\n";}}}cout<<"\n";return 0;}A2求任意n个数中的最大数和最小数:先输入一个正整数n(个数),而后再输入任意n个实数,找出这n个数中的最大数及最小数并显示出来。
#include "stdafx.h"#include "stdio.h"#include<iostream>using namespace std;void a2(float arr[], int n) {float min = arr[0];float max = arr[0];for (int i = 0; i < n; i++) {if (min > arr[i]) {min = arr[i];} else if (max < arr[i]) {max = arr[i];}}cout<<"最小的数: "<<min<<"\n最大的数: "<<max;}int main(int argc, char* argv[]){float *pArray = NULL;int n,max,min;cout<<"请输入实数个数n: ";cin>>n;pArray = new float[n];for (int i = 0; i < n; i++) {cout<<"请输入第"<<i+1<<"个实数: ";cin>>pArray[i];}a2(pArray, n);printf("\n");return 0;}B3对两个有序数组进行合并:设有如下数组A、B,并假设两个数组的元素都已经有序(从大到小降序排列)。
《计算机算法设计与分析》课程设计
用分治法解决快速排序问题及用动态规划法解决最优二叉搜索树问题及用回溯法解决图的着色问题一、课程设计目的:《计算机算法设计与分析》这门课程是一门实践性非常强的课程,要求我们能够将所学的算法应用到实际中,灵活解决实际问题。
通过这次课程设计,能够培养我们独立思考、综合分析与动手的能力,并能加深对课堂所学理论和概念的理解,可以训练我们算法设计的思维和培养算法的分析能力。
二、课程设计内容:1、分治法:(2)快速排序;2、动态规划:(4)最优二叉搜索树;3、回溯法:(2)图的着色。
三、概要设计:分治法—快速排序:分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。
递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。
分治法的条件:(1)该问题的规模缩小到一定的程度就可以容易地解决;(2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;(3) 利用该问题分解出的子问题的解可以合并为该问题的解;(4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
抽象的讲,分治法有两个重要步骤:(1)将问题拆开;(2)将答案合并;● 动态规划—最优二叉搜索树:动态规划的基本思想是将问题分解为若干个小问题,解子问题,然后从子问题得到原问题的解。
设计动态规划法的步骤:(1)找出最优解的性质,并刻画其结构特征; (2)递归地定义最优值(写出动态规划方程); (3)以自底向上的方式计算出最优值;(4)根据计算最优值时得到的信息,构造一个最优解。
● 回溯法—图的着色回溯法的基本思想是确定了解空间的组织结构后,回溯法就是从开始节点(根结点)出发,以深度优先的方式搜索整个解空间。
这个开始节点就成为一个活结点,同时也成为当前的扩展结点。
在当前的扩展结点处,搜索向纵深方向移至一个新结点。
这个新结点就成为一个新的或节点,并成为当前扩展结点。
《计算机算法设计与分析》课程设计
《计算机算法设计与分析》课程设计用分治法解决快速排序问题及用动态规划法解决最优二叉搜索树问题及用回溯法解决图的着色问题一、课程设计目的:《计算机算法设计与分析》这门课程是一门实践性非常强的课程,要求我们能够将所学的算法应用到实际中,灵活解决实际问题。
通过这次课程设计,能够培养我们独立思考、综合分析与动手的能力,并能加深对课堂所学理论和概念的理解,可以训练我们算法设计的思维和培养算法的分析能力。
二、课程设计内容:1、分治法:(2)快速排序;2、动态规划:(4)最优二叉搜索树;3、回溯法:(2)图的着色。
三、概要设计:分治法—快速排序:分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。
递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。
分治法的条件:(1) 该问题的规模缩小到一定的程度就可以容易地解决;(2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;(3) 利用该问题分解出的子问题的解可以合并为该问题的解;(4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
抽象的讲,分治法有两个重要步骤:(1)将问题拆开;(2)将答案合并;动态规划—最优二叉搜索树:动态规划的基本思想是将问题分解为若干个小问题,解子问题,然后从子问题得到原问题的解。
设计动态规划法的步骤:(1)找出最优解的性质,并刻画其结构特征;(2)递归地定义最优值(写出动态规划方程);(3)以自底向上的方式计算出最优值;(4)根据计算最优值时得到的信息,构造一个最优解。
●回溯法—图的着色回溯法的基本思想是确定了解空间的组织结构后,回溯法就是从开始节点(根结点)出发,以深度优先的方式搜索整个解空间。
这个开始节点就成为一个活结点,同时也成为当前的扩展结点。
在当前的扩展结点处,搜索向纵深方向移至一个新结点。
这个新结点就成为一个新的或节点,并成为当前扩展结点。
c课程设计题目及
c 课程设计题目及一、教学目标本课程的教学目标是使学生掌握C语言的基本语法、数据结构及算法,培养学生运用C语言解决实际问题的能力。
具体目标如下:1.知识目标:(1)理解C语言的基本语法,包括数据类型、运算符、表达式等。
(2)掌握C语言的控制结构,包括顺序结构、分支结构和循环结构。
(3)了解C语言的基本数据结构,如数组、链表、栈和队列。
(4)熟悉C语言的函数,包括函数的定义、调用和返回值。
(5)理解C语言的面向对象编程思想,如封装、继承和多态。
2.技能目标:(1)能够运用C语言编写简单的程序,解决实际问题。
(2)具备阅读和理解C语言程序的能力。
(3)掌握C语言的调试技巧,能够查找和解决问题。
(4)熟练使用C语言的开发工具,如编译器、调试器等。
3.情感态度价值观目标:(1)培养学生对计算机科学的兴趣,提高其主动学习的积极性。
(2)培养学生团队合作精神,提高其沟通协作能力。
(3)培养学生勇于创新、追求真理的科学精神。
二、教学内容本课程的教学内容主要包括C语言的基本语法、数据结构及算法。
具体安排如下:1.C语言的基本语法:介绍数据类型、运算符、表达式等。
2.C语言的控制结构:顺序结构、分支结构和循环结构。
3.C语言的数据结构:数组、链表、栈和队列。
4.C语言的函数:函数的定义、调用和返回值。
5.C语言的面向对象编程:封装、继承和多态。
6.实际编程案例:运用C语言解决实际问题。
三、教学方法本课程采用多种教学方法,以激发学生的学习兴趣和主动性。
具体方法如下:1.讲授法:讲解C语言的基本语法、数据结构和算法。
2.案例分析法:分析实际编程案例,引导学生运用C语言解决实际问题。
3.实验法:让学生动手编写C语言程序,提高其实际操作能力。
4.讨论法:学生进行小组讨论,培养其团队合作精神。
四、教学资源本课程所需教学资源包括教材、参考书、多媒体资料和实验设备。
具体如下:1.教材:选用权威、实用的C语言教材。
2.参考书:提供丰富的C语言相关参考书籍,供学生自主学习。
VC课程设计题目(五篇模版)
VC课程设计题目(五篇模版)第一篇:VC课程设计题目VC++课程设计题目 B090110-12(2012-04-23 – 2012-05-19)前言:本课程设计分成自测题和综合题两部分。
两部分都列入验收。
练习题:共11道。
内容覆盖主要基本技术:基本的开发环境(调试技术),文件操作,动态链接库,图形图像编程,多线程编程,控件开发等。
每个学生选择5个完成,要求如下:必做:1;2,3选择其一;4,5选择其一;6-11选择其二;1.基本环境调试将例程1用VC++打开,修改错误使程序能够运行。
理解编译错误,运行错误等。
2.数据库操作通过ODBC数据源访问数据库(ACCESS),数据库中保存以下内容:学生姓名,性别,年龄,家庭住址,电话,电子邮件,爱好等。
再以上基础上进行该记录的读出并可编辑浏览显示。
3.文件操作写一个档案文件保存以下内容:学生姓名,性别,年龄,家庭住址,电话,电子邮件,爱好等。
再以上基础上进行该文件的读出并可编辑浏览显示。
4.图形编程提供一个图形工具界面,让用户能够画出直线,椭圆,多边形等几何元素,结果可以保存并可读出。
5.图像显示编程加载显示位图文件(bmp)。
实现多个位图的叠加显示效果。
在此基础上,实现动画效果。
6.字符串操作能够从磁盘上选择打开文本文档,读入所有内容并显示,统计所有的字符数目,单词数目,中文字符串的数目。
7.多线程技术目的:掌握多线程编程的基本概念,掌握用户线程的编程方法和调试方法。
建立一个工程,主线程负责用户交互,界面上提供一个按钮,通过它用户建立一个新的线程处理复杂的计算。
多个线程可以共享内存中的某些变量。
线程可以中止,挂起。
线程间需要同步。
8.通信技术利用套接字编写双机通信程序,从服务器接收GPS数据。
协议内容如下:0xDB,纬度(4字节浮点),经度(4字节浮点),时间(4字节CTime),速度(2字节整型),校验(1字节异或),0xDB在此基础上,能够在屏幕上显示其位置和速度等信息。
c程序课程设计题目
c程序课程设计题目一、教学目标本课程的教学目标是使学生掌握C程序设计的基本概念、语法和编程技巧,培养学生具备解决问题的能力,并能够运用C语言编写简单的程序。
1.理解C语言的基本概念,如变量、数据类型、运算符等。
2.掌握C语言的控制结构,如条件语句、循环语句等。
3.熟悉C语言的函数、数组和指针等高级概念。
4.能够使用C语言编写简单的程序,解决实际问题。
5.具备阅读和理解C语言程序的能力。
6.能够对已有的C语言程序进行修改和优化。
情感态度价值观目标:1.培养学生对计算机科学的兴趣和热情。
2.培养学生具备良好的编程习惯和团队协作精神。
3.培养学生具备创新意识和持续学习的能力。
二、教学内容本课程的教学内容主要包括C语言的基本概念、语法和编程技巧。
1.C语言的基本概念:变量、数据类型、运算符等。
2.C语言的控制结构:条件语句、循环语句等。
3.C语言的函数、数组和指针等高级概念。
4.C语言的编程技巧:代码规范、调试技巧等。
第1周:C语言的基本概念和语法。
第2周:控制结构及其应用。
第3周:函数、数组和指针。
第4周:编程技巧和综合应用。
三、教学方法本课程将采用讲授法、案例分析法和实验法等多种教学方法相结合的方式进行教学。
1.讲授法:通过讲解和示例,使学生掌握C语言的基本概念和语法。
2.案例分析法:通过分析实际案例,使学生理解C语言的控制结构和编程技巧。
3.实验法:通过实验操作,使学生熟练掌握C语言的编程方法和技巧。
四、教学资源本课程的教学资源包括教材、实验设备和多媒体资料。
1.教材:《C程序设计语言》(K&R)或《C Primer Plus》。
2.实验设备:计算机、编程环境等。
3.多媒体资料:教学PPT、视频教程等。
教学资源将用于支持教学内容和教学方法的实施,丰富学生的学习体验,并帮助学生更好地掌握C程序设计的相关知识。
五、教学评估本课程的评估方式包括平时表现、作业和考试等,以全面客观地评价学生的学习成果。
算法设计与分析(详细解析(含源代码)
常用算法设计方法要使计算机能完成人们预定的工作,首先必须为如何完成预定的工作设计一个算法,然后再根据算法编写程序。
计算机程序要对问题的每个对象和处理规则给出正确详尽的描述,其中程序的数据结构和变量用来描述问题的对象,程序结构、函数和语句用来描述问题的算法。
算法数据结构是程序的两个重要方面。
算法是问题求解过程的精确描述,一个算法由有限条可完全机械地执行的、有确定结果的指令组成。
指令正确地描述了要完成的任务和它们被执行的顺序。
计算机按算法指令所描述的顺序执行算法的指令能在有限的步骤内终止,或终止于给出问题的解,或终止于指出问题对此输入数据无解。
通常求解一个问题可能会有多种算法可供选择,选择的主要标准是算法的正确性和可靠性,简单性和易理解性。
其次是算法所需要的存储空间少和执行更快等。
算法设计是一件非常困难的工作,经常采用的算法设计技术主要有迭代法、穷举搜索法、递推法、贪婪法、回溯法、分治法、动态规划法等等。
另外,为了更简洁的形式设计和藐视算法,在算法设计时又常常采用递归技术,用递归描述算法。
一、迭代法迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。
设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行:(1)选一个方程的近似根,赋给变量x0;(2)将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;(3)当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。
若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。
上述算法用C程序的形式表示为:【算法】迭代法求方程的根{ x0=初始近似根;do {x1=x0;x0=g(x1);/*按特定的方程计算新的近似根*/} while ( fabs(x0-x1)>Epsilon);printf(“方程的近似根是%f\n”,x0);}迭代算法也常用于求方程组的根,令X=(x0,x1,…,x n-1)设方程组为:x i=g i(X) (I=0,1,…,n-1)则求方程组根的迭代算法可描述如下:【算法】迭代法求方程组的根{ for (i=0;i<n;i++)x[i]=初始近似根;do {for (i=0;i<n;i++)y[i]=x[i];for (i=0;i<n;i++)x[i]=gi(X);for (delta=0.0,i=0;i<n;i++)if (fabs(y[i]-x[i])>delta) delta=fabs(y[i]-x[i]);} while (delta>Epsilon);for (i=0;i<n;i++)printf(“变量x[%d]的近似根是%f”,I,x[i]);printf(“\n”);}具体使用迭代法求根时应注意以下两种可能发生的情况:(1)如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制;(2)方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败。
C程序代码大全
C程序代码大全Prepared on 21 November 2021<<endl;cout<<"------------------"<<endl;<<endl;cout<<"pi="<<pi<<" r="<<r<<" s="<<s<<endl;}#include <> 1 c<<endl;;int a[10];double xy[10];cout<<"sizeof(str)="<<sizeof(str)<<endl;cout<<"sizeof(a)="<<sizeof(a)<<endl;cout<<"sizeof(xy)="<<sizeof(xy)<<endl;<<endl;else if (score>=80)cout<<"Your grade is a B."<<endl;else if (score>=70)cout<<"Your grade is a C."<<endl;else if (score>=60)cout<<"Your grade is a D."<<endl;elsecout<<"Your grade is a E."<<endl;}#include <>main(){int n;cout<<"n=";cin>>n;if (n>=0 && n<=100 &&n%2==0)cout<<"n="<<n<<endl;elsecout<<"The "<<n<<" is out of range!"<<endl; }#include <>main(){int a,b,Max;.10for(int i=1;i<=10;i++)cout<<i<<" ";cout<<endl;.1for(int j=10;j>=1;j--)cout<<j<<" ";cout<<endl;.9for(int k=1;k<=10;k=k+2)cout<<k<<" ";cout<<endl;.Zfor(char c='A';c<='Z';c++)cout<<c;cout<<endl;.for(float x=0;x<=;x=x+cout<<x<<" ";cout<<endl;.for(float x1=0;x1<=+2;x1=x1+cout<<x1<<" ";cout<<endl;.+100int s=0;for(int n=1;n<=100;n++)s=s+n;cout<<"s="<<s<<endl;}#include<>main(){.+100int s=0,n=1;while(n<=100) {s=s+n;n++;}cout<<"s="<<s<<endl;.+100int s=0,n=0;do {n++;s+=n;}while(n<100);cout<<"s="<<s<<endl;um;cin>>st[i].name;cin>>st[i].maths;cin>>st[i].physics;cin>>st[i].chemistry;}otal=st[i].maths+st[i].physics+st[i].chemistry; um<<'\t';cout<<st[i].name<<'\t';cout<<st[i].maths<<'\t';cout<<st[i].physics<<'\t';cout<<st[i].chemistry<<'\t';cout<<st[i].total<<endl;}}#include<>main(){ame="<<(*p).name<<endl;cout<<"(*p).sex="<<(*p).sex<<endl;cout<<"(*p).age="<<(*p).age<<endl;cout<<"p->name="<<p->name<<endl;cout<<"p->sex="<<p->sex<<endl;cout<<"p->age="<<p->age<<endl;ame;cout<<"sex:";cin>>(*p).sex;cout<<"age:";cin>>(*p).age;ame="<<(*p).name<<endl;cout<<"(*p).sex="<<(*p).sex<<endl;cout<<"(*p).age="<<(*p).age<<endl;cout<<"-------------------------"<<endl;ame<<'\t';cout<<x[i].sex<<'\t';cout<<x[i].age<<endl;}cout<<"----------------"<<endl;;int int_values[] = {51, 23, 2, 44, 45,0,11};float float_values[] = {, , , , };student st_arr[]={101,"WangLin",92,102,"LiPing",85,103,"ZhaoMin",88};um<<" ";cout<<st_arr[i].name<<" ";cout<<st_arr[i].grade<<endl;}}#include<>otal<a[j].total)swap_Rec(&a[i],&a[j]); <<"\t"<<str_len("This is a test.")<<endl; }#include<>void disp(void); <<endl;}#include<><<endl;cout<<"Exiting program."<<endl;exit(1); <<endl;cout<<"Exiting program."<<endl;exit(1); <<endl;cout<<"Exiting program."<<endl;exit(1); <<endl;cout<<"Exiting program."<<endl;exit(1); <<endl;cout<<"Exiting program."<<endl;exit(1); <<endl;cout<<"Exiting program."<<endl;exit(1); <<endl;cout<<"Exiting program."<<endl;exit(1); <<endl;cout<<"Exiting program."<<endl;exit(1); <<endl;cout<<"Exiting program."<<endl;exit(1); um;cin>>st[i].name;cin>>st[i].grade;fprintf(fp1,"%d %s %f\n",st[i].num,st[i].name,st[i].grade);}fclose(fp1); <<endl; cout<<"Exiting program."<<endl;exit(1); <<endl;cout<<"Exiting program."<<endl;exit(1); <<endl;cout<<"Exiting program."<<endl;exit(1); <<endl;cout<<"Exiting program."<<endl;exit(1); <<endl;cout<<"Exiting program."<<endl;exit(1); <<endl;cout<<"Exiting program."<<endl;exit(1); <<endl;cout<<"Exiting program."<<endl;exit(1); <<endl;cout<<"Exiting program."<<endl;exit(1); <<endl;cout<<"Exiting program."<<endl;exit(1); */putc( 'A', stdin );if( ferror( stdin ) ){perror( "Write error" );clearerr( stdin );}/* See if read causes an error. */printf( "Will input cause an error " );c = getc( stdin );if( ferror( stdin ) ){perror( "Read error" );clearerr( stdin );}}#include<>#include<><<endl;for (i=1; i<=MAX; i++) {cin>>x;(x);}<<endl;}void push(float x) <<endl;for (i=1; i<=MAX; i++) {cin>>x;(x);}<<endl;}void push(float x) <<endl;}~stack(void) << endl; << endl;}<< endl; isp_count();delete p;();}#include<><< endl;}~ex_class() {cout << "The Object destroyed." <<endl;}void set_value(int n);void show_val(char *name);} ;<<endl;}#include<>um :";cout<<num<<endl;}};um :";cout<<<<endl;}um="<<num<<endl;}public: um=";cout<<<<endl;}how_value("(*p)obj2");al="<<val<<endl;DispFirst();}};<<endl;}virtual void aFn2(void) {cout<<"aFn2 is in Base class."<<endl;}<<endl;}};<<endl;}<<endl;<<endl;}<<endl;<<endl;}void aFn2(void) {cout<<"aFn2 is in First derived class."<<endl; }};<<endl;}void aFn2(void){cout<<"aFn2 is in Second derived class."<<endl; }};;cout<<"s1: "<<s1<<endl;cout<<"s2: "<<s2<<endl;10.2f10.5f;cout<<"String: "<<string<<endl;cout<<"p : "<<p<<endl;}#include<>#include <>;int n;1.7320534f << endl;}~stack(void) {cout << "Stack Destroyed." << endl;}void push(T);T pop(void);};<< endl;return;}stck[tos++] = i;}template <class T> T stack<T>::pop(void){if(tos==0){cout << "Stack underflow." << endl;return 0;}return stck[--tos];}irst;cout<<","<<(*theIterator).second<<" ";}cout<<endl;irst;cout<<","<<(*theIterator).second<<" ";}cout<<endl;irst;cout<<","<<(*it).second<<" ";}cout<<endl;econd << " ";elsecout << "[err] ";}cout << endl;}}#include <iostream>#include <string>#include <map>using namespace std;econd;cout<<"\t"<<(*theIterator).first<<endl; }econd;cout<<"\t"<<(*i).first<<endl;}econd;cout<<"\t"<<(*it).first<<endl;}econd;cout<<"\t"<<(*i).first<<endl;}}#include <iostream>#include <valarray>#include <>using namespace std;#define ARRAY_SIZE 3 .入栈for (i=0;i<10;i=i+2)(i);if (!()) {cout << "()=20;" << endl;()=20;}//弹出栈中所有的数据并显示cout<<"stack1: ";while (!()) {cout<<()<<" ";();}cout<<endl;}#include <iostream>#include <list>#include <numeric>using namespace std;//创建一个list容器的实例LISTINT,其存放int型数据typedef list<int> LISTINT;void main(void){//用LISTINT创建一个名为listOne的list对象 LISTINT listOne;//指定i为迭代器变量LISTINT::iterator i;LISTINT::reverse_iterator ir;//从前面向listOne容器中添加数据(2);(1);//从后面向listOne容器中添加数据(3);(4);//从前向后显示listOne中的数据for (i = (); i != (); ++i)cout << *i << " ";cout << endl;//从后向后显示listOne中的数据for (ir =();ir!=(); ++ir)cout << *ir << " ";cout << endl;//从键盘上输入数据for (i = (); i != (); ++i) {cout<<"listOne :";cin>>(*i);}//从前向后显示listOne中的数据for (i = (); i != (); ++i)cout << *i << " ";cout << endl;//bidirectional迭代器不允许加减运算// i=()+1;}#include <iostream>#include <iostream>#include <numeric>#include <vector>#include <list>#include <set>using namespace std;//利用类模板生成类实例typedef vector < int > IntArray;typedef list <int> LISTINT;typedef set<int> SET_INT;int add(int a, int b) {return a+b;}//在main()函数中测试accumulate算法void main (){//--------------------------------------------// accumulate算法对于普通数组的计算//--------------------------------------------- int x[]={1,3,5,7,9};cout<<"x[]:";for (int i=0;i<5;i++)cout<<x[i]<<" ";cout<<endl;cout<<"accumulate(x,x+5,0)=";cout<<accumulate(x,x+5,0)<<endl;int val=100;cout<<"val="<<val<<endl;cout<<"accumulate(x,x+5,val)=";cout<<accumulate(x,x+5,val)<<endl;//--------------------------------------------// accumulate算法对于vector容器的计算//--------------------------------------------- //声明intvector容器和迭代器iiIntArray intvector;IntArray::iterator ii;//向intvector容器中插入元素for (i=1; i<=5; i++) {(i);};//显示intvector容器中的元素值和累加结果cout << "intvector: "<<endl;for (ii=();ii !=();++ii)cout<<(*ii)<<" ";cout<<endl;cout<<"accumulate(),(),0)=";cout<<accumulate(),(),0)<<endl;//--------------------------------------------// accumulate算法对于list容器的计算//--------------------------------------------- //声明list容器对象和迭代器LISTINT::iterator iL;LISTINT list1;//向list1容器对象中插入元素并显示(1);(3);(5);(2);(6);//显示list1容器的元素值和累加结果cout << "list1: "<<endl;for (iL=();iL !=();++iL)cout<<(*iL)<<" ";cout<<endl;cout<<"accumulate(),(),0)=";cout<<accumulate(),(),0)<<endl;//--------------------------------------------// accumulate算法对于set容器的计算//--------------------------------------------- //声明set容器对象和迭代器SET_INT set1;SET_INT::iterator si;//向set1容器中插入元素(5);(20);(10);(15);(25);//显示set1容器的元素值和累加结果cout <<"set1: "<<endl;for (si=();si !=();++si)cout<<(*si)<<" ";cout<<endl;cout<<"accumulate(),(),0)=";cout<<accumulate(),(),0)<<endl;cout<<"accumulate(),(),100)=";cout<<accumulate(),(),100)<<endl;}#include <iostream>#include <algorithm>#include <vector>#include <list>#include <set>#define size 10using namespace std;//产生指定范围的整数随机数int getrand(int min,int max) {int m;m=(max-min);m=min+double(rand())/RAND_MAX*m ;return m;}//利用类模板生成实例typedef vector < int > IntArray;typedef list <int> LISTINT;typedef set<int> SET_INT;//在main()函数中测试accumulate算法void main (){//--------------------------------------------// count算法对于普通数组的计算//--------------------------------------------- int x[size];cout<<"x[]:";for (int i=0;i<size;i++) {x[i]=getrand(1,3);cout<<x[i]<<" ";}cout<<endl;cout<<"count(x,x+size,2)=";cout<<count(x,x+size,2)<<endl;cout<<"count(x+2,x+8,2)=";cout<<count(x+2,x+8,2)<<endl;//--------------------------------------------// count算法对于vector容器的计算//声明intvector容器和迭代器iiIntArray intvector;IntArray::iterator ii;//向intvector容器中插入元素for (i=1; i<size; i++) {(getrand(2,6));};//显示intvector容器中的元素值和统计结果cout << "intvector: ";for (ii=();ii !=();++ii)cout<<(*ii)<<" ";cout<<endl;cout<<"count(),(),4)=";cout<<count(),(),4)<<endl;//--------------------------------------------// count算法对于list容器的计算//--------------------------------------------- //声明list容器对象和迭代器LISTINT::iterator iL;LISTINT list1;//向list1容器对象中插入元素并显示for (i=1; i<size; i++) {(getrand(3,5));};//显示list1容器的元素值和统计结果cout << "list1: ";for (iL=();iL !=();++iL)cout<<(*iL)<<" ";cout<<endl;cout<<"count(),(),3)=";cout<<count(),(),3)<<endl;//--------------------------------------------// count算法对于set容器的计算//--------------------------------------------- //声明set容器对象和迭代器SET_INT set1;SET_INT::iterator si;//向set1容器中插入元素for (i=1; i<size; i++) {(getrand(1,10));};//显示set1容器的元素值和统计结果cout <<"set1: ";for (si=();si !=();++si)cout<<(*si)<<" ";cout<<endl;cout<<"count(),(),5)=";cout<<count(),(),5)<<endl;}#include <iostream>#include <algorithm>#include <string>#include <vector>//如果字符串以'S'开头,则返回trueint MatchFirstChar( const string& str){string s("S") ;return s == (0,1) ;}//测试count_if算法void main(){const int VECTOR_SIZE = 8 ;//生成成员类型为strings的vector容器类typedef vector<string > StringVector ;//定义迭代器类型typedef StringVector::iterator StringVectorIt ;//声明vector容器的对象StringVector NamesVect(VECTOR_SIZE) ;//声明迭代器StringVectorIt start, end, it ;int result = 0 ; // 存放统计数据//初始化vector容器NamesVectNamesVect[0] = "She" ;NamesVect[1] = "Sells" ;NamesVect[2] = "Sea" ;NamesVect[3] = "Shells" ;NamesVect[4] = "by" ;NamesVect[5] = "the" ;NamesVect[6] = "Sea" ;NamesVect[7] = "Shore" ;//设置容器的起始位置和终止位置start = () ;end = () ;//显示NamesVect容器的元素cout << "NamesVect: " ;for(it = start; it != end; it++)cout << *it << " " ;cout <<endl ;//统计并显示NamesVect容器的所有元素中以'S'字符开头的字符串 result = count_if(start, end, MatchFirstChar) ;cout << "Number of elements that start with letter \"S\" = " << result << endl ;//显示NamesVect容器[1,6]之间的元素cout <<"NamesVect[1]--NamesVect[6]: " ;for(it =&NamesVect[1]; it != &NamesVect[7]; it++)cout << *it << " " ;cout <<endl ;//统计并显示NamesVect容器的所有元素中以'S'字符开头的字符串cout << "Number of elements that start with letter \"S\" = " << result << endl ;}#include <iostream>#include <algorithm>#include <vector>using namespace std;//利用类模板生成实例typedef vector < int > IntArray;//显示数组void put_array(int x[],int size) {for(int i=0;i<size;i++)cout<<x[i]<<" ";cout<<endl;}//显示vector容器中的元素void put_vector(IntArray v){IntArray::iterator theIterator;for (theIterator=();theIterator!=();++theIterator){cout<<(*theIterator)<<" ";}cout<<endl;}//在main()函数中测试fill和fill_n算法void main (){//--------------------------------------------// fill和fill_n算法对普通数组的计算//---------------------------------------------int x[]={1,3,5,7,9};cout << "x[]: ";put_array(x,5);//填数处理fill(x+1,x+3,2);cout << "fill(x+1,x+3,2): "<<endl;put_array(x,5);fill_n(x,3,8);cout << "fill_n(x,3,8): "<<endl;put_array(x,5);//--------------------------------------------// fill和fill_n算法对于vector容器的计算//---------------------------------------------//声明intvector容器和迭代器iiIntArray intvector;//向intvector容器中插入元素for (int i=1; i<=10; i++) {(i);};//显示intvector容器中的元素值和统计结果cout << "intvector: "<<endl;put_vector(intvector);//填数处理fill(),()+3,2);put_vector(intvector);fill_n(&intvector[5],3,8);cout << "fill_n(&intvector[5],3,8): "<<endl;put_vector(intvector);}#include <iostream>#include <algorithm>#include <vector>#define ARRAY_SIZE 10using namespace std;//利用类模板生成实例typedef vector < int > IntArray;//显示数组void put_array(int x[],int size) {for(int i=0;i<size;i++)cout<<x[i]<<" ";cout<<endl;}//显示vector容器中的元素void put_vector(IntArray v){IntArray::iterator theIterator;for (theIterator=();theIterator!=();++theIterator){cout<<(*theIterator)<<" ";}cout<<endl;}//在main()函数中测试find()算法void main (){int i,value,*p;//--------------------------------------------// find()算法对于普通数组的处理//---------------------------------------------int x[ARRAY_SIZE]={1,3,5,7,9,2,4,6,8,10};cout << "x[]: ";put_array(x,ARRAY_SIZE);//find()算法查找,并显示查找结果for(i=0;i<=2;i++) {cout<<"value=";cin>>value;p=find(x,x+ARRAY_SIZE,value);if (p != x + ARRAY_SIZE) { //查到cout << "First element that matches " << value;cout<< " is at location " << p - x<< endl;}else { //未查到cout << "The sequence does not contain any elements"; cout<< " with value " << value << endl ;}}//声明intvector容器对象IntArray intvector;//向intvector容器中插入元素for (i=1; i<=10; i++) {(i);};//显示intvector容器中的元素值cout << "intvector: ";put_vector(intvector);//find()算法查找,并显示查找结果IntArray::iterator pos;for (i=0;i<=2;i++) {cout<<"value=";cin>>value;pos=find(),(),value);if (pos != ()) { //查到cout << "First element that matches " << value;cout<< " is at location " <<pos - ()<< endl;}else { //未查到cout << "The sequence does not contain any elements"; cout<< " with value " << value << endl ;}}}#include <iostream>#include <algorithm>#include <vector>#define ARRAY_SIZE 10using namespace std;//利用类模板生成实例typedef vector < int > IntArray;//显示数组void put_array(int x[],int size) {for(int i=0;i<size;i++)cout<<x[i]<<" ";}//显示vector容器中的元素void put_vector(IntArray v){IntArray::iterator theIterator;for (theIterator=();theIterator!=();++theIterator){cout<<(*theIterator)<<" ";}}//在main()函数中测试find()_end()算法void main (){int x[ARRAY_SIZE]={1,3,5,7,9,2,4,6,8,10};cout << "x[]: ";put_array(x,ARRAY_SIZE);cout<<endl;int y[]={5,7,9};cout << "y[]: ";put_array(y,3);cout<<endl;// find_end()算法查找,并显示查找结果int *p=find_end(x,x+ARRAY_SIZE,&y[0],&y[2]);if (p != x + ARRAY_SIZE) { //查到cout << "The first element that matches :" ;put_array(y,3);cout<< " is at location in x" << p - x<< endl;}else { //未查到cout << "The sequence does not contain any elements";cout<< " with value " ;put_array(&x[3],3);}//--------------------------------------------// find_end()算法对vector容器的处理//---------------------------------------------//声明intvector容器对象IntArray intvector;//向intvector容器中插入元素for (int i=1; i<=10; i++) {(i);};//显示intvector容器中的元素值cout << "intvector: ";put_vector(intvector);cout<<endl;IntArray temp;(5);(6);(7);cout << "temp: ";put_vector(temp);cout<<endl;// find_end()算法查找,并显示查找结果IntArray::iterator pos;pos=find_end(),(),(),());if (pos != ()) { //查到cout << "The first element that matches ";put_vector(temp);cout<< " is at location in intvector " <<pos - ()<< endl; }else { //未查到cout << "The sequence does not contain any elements";put_vector(temp);cout<< endl ;}}#include <iostream>#include <vector>#include <algorithm>using namespace std;//返回一个Fibonacci数,其由generate_n()算法调用int Fibonacci1(void){static int r;static int f1 = 0;static int f2 = 1;r = f1 + f2 ;f1 = f2 ;f2 = r ;return f1 ;}//返回一个Fibonacci数,其由generate()算法调用int Fibonacci2(void){static int r;static int f1 = 0;static int f2 = 1;r = f1 + f2 ;f1 = f2 ;f2 = r ;return f1 ;}//定义整型数的vector容器类typedef vector<int > IntVector ;//显示vector容器中的元素void put_vector(IntVector v,char *name){IntVector::iterator theIterator;cout<<name<<":"<<endl;for (theIterator=();theIterator!=();++theIterator){cout<<(*theIterator)<<" ";}cout<<endl;}//测试generate()和generate_n()算法void main(){const int VECTOR_SIZE = 15 ;//定义迭代器类typedef IntVector::iterator IntVectorIt ;//声明vector容器对象IntVector Numbers1(VECTOR_SIZE),Numbers2(VECTOR_SIZE); int i ;//初始化vector容器对象Numbers1[i] = i ;//显示vector容器对象的元素cout << "Before calling generate_n:" << endl ;put_vector(Numbers1,"Numbers1");//利用generate_n算法用Fibonacci 数填充vector容器 generate_n(), VECTOR_SIZE, Fibonacci1) ;//显示vector容器对象的元素cout << "After calling generate_n:" << endl ;put_vector(Numbers1,"Numbers1");//利用generate算法用Fibonacci 数填充vector容器generate(),(), Fibonacci2) ;//显示vector容器对象的元素cout << "After calling generate:" << endl ;put_vector(Numbers2,"Numbers2");}#include <iostream>#include <algorithm>#include <vector>using namespace std;//利用类模板生成实例typedef vector < int > IntArray;//显示数组void put_array(int x[],int size) {for(int i=0;i<size;i++)cout<<x[i]<<" ";cout<<endl;}//显示vector容器中的元素void put_vector(IntArray v){IntArray::iterator theIterator;for (theIterator=();theIterator!=();++theIterator){ cout<<(*theIterator)<<" ";}cout<<endl;}//在main()函数中测试reverse()和reverse_copy()算法void main (){//--------------------------------------------// reverse()和reverse_copy()算法对普通数组处理//---------------------------------------------int x[]={1,3,5,7,9};cout<<"x[]:";put_array(x,5);//reverse()反转x数组并显示reverse(x,x+5);put_array(x,5);int y[]={2,4,6,8,10};cout<<"y[]:";put_array(y,5);//reverse_copy()反转y数组的部分元素并拷贝到x数组第2个元素位置 reverse_copy(y+1,y+3,x+1);cout<<"x[]:";put_array(x,5);cout<<"y[]:";put_array(y,5);//--------------------------------------------// reverse()和reverse_copy()算法对vector容器的处理//---------------------------------------------//声明intvector容器和迭代器iiIntArray intvector;//向intvector容器中插入元素for (int i=1; i<=10; i++) {(i);};//显示intvector容器中的元素值cout << "intvector: "<<endl;put_vector(intvector);//reverse()对于vector容器的处理reverse(),());cout << "intvector: "<<endl;put_vector(intvector);// reverse_copy对于vector容器的处理IntArray temp(5);reverse_copy()+2,()+7,());cout << "temp: "<<endl;put_vector(temp);}#include <iostream>#include <algorithm>#include <vector>#include <>#define ARRAY_SIZE 15using namespace std;//定义整型数的vector容器类typedef vector<int > IntVector ;//显示数组void put_array(int x[],int size) {for(int i=0;i<size;i++)cout<<x[i]<<" ";cout<<endl;}//显示vector容器中的元素void put_vector(IntVector v,char *name){IntVector::iterator theIterator;for (theIterator=();theIterator!=();++theIterator){ cout<<(*theIterator)<<" ";}cout<<endl;}//产生指定范围的整数随机数int getrand(int min,int max) {int m;m=(max-min);m=min+double(rand())/RAND_MAX*m ;return m;}//在main()函数中测试sort()和partial_sort()算法void main (){int i;//--------------------------------------------// sort()和partial_sort()算法对普通数组处理//---------------------------------------------//sort()算法处理数组,并显示int x[ARRAY_SIZE];for (i=0;i<ARRAY_SIZE;i++) {x[i]=getrand(1,20);}cout<<"x[]:";put_array(x,ARRAY_SIZE);sort(x,x+ARRAY_SIZE);cout<<"sort(x,x+ARRAY_SIZE):"<<endl;put_array(x,ARRAY_SIZE);//partial_sort()算法对于数组进行处理int y[ARRAY_SIZE];for (i=0;i<ARRAY_SIZE;i++) {y[i]=getrand(1,30) ;}cout<<"y[]:";put_array(y,ARRAY_SIZE);partial_sort(y+2,y+7,y+ARRAY_SIZE);cout<<"partial_sort(y+2,y+7,y+ARRAY_SIZE):"<<endl; put_array(y,ARRAY_SIZE);//--------------------------------------------// sort()和partial_sort()算法对vector容器的处理//---------------------------------------------IntVector Numbers1,Numbers2;for(i=0;i<15;i++) {(getrand(1,30));(getrand(1,30));}put_vector(Numbers1,"Numbers1");put_vector(Numbers2,"Numbers2");//sort()算法处理并显示sort(),());cout<<"After call sort():"<<endl;put_vector(Numbers1,"Numbers1");//partial_sort()算法处理并显示partial_sort()+2,()+7,());。
c常用算法程序集
c常用算法程序集C常用算法程序集一、排序算法排序算法是计算机科学中最基本、最常用的算法之一,常用于按照一定的规则将一组数据进行有序排列。
常见的排序算法有:冒泡排序、插入排序、选择排序、快速排序、归并排序等。
1. 冒泡排序:通过相邻元素的比较和交换来实现排序。
每一轮将最大的元素逐渐“冒泡”到末尾。
时间复杂度为O(n^2)。
2. 插入排序:将待排序的元素插入已排好序的部分,从而达到排序的目的。
时间复杂度为O(n^2),但在部分有序的情况下表现较好。
3. 选择排序:每一轮从待排序的元素中选出最小(或最大)的元素放到已排序的末尾。
时间复杂度为O(n^2),性能较差。
4. 快速排序:通过一趟排序将待排序的序列分割成两部分,其中一部分的所有元素都比另一部分小。
再分别对两部分进行排序,递归地进行下去。
时间复杂度为O(nlogn),性能较好。
5. 归并排序:将待排序的序列分成若干个子序列,分别进行排序,然后再将排好序的子序列合并。
时间复杂度为O(nlogn),稳定且效率较高。
二、查找算法查找算法是在给定的数据集中寻找特定元素的过程,常用于在大规模数据中快速定位目标元素。
常见的查找算法有:顺序查找、二分查找、哈希查找等。
1. 顺序查找:逐个遍历待查找的元素,直到找到目标元素或遍历完整个数据集。
时间复杂度为O(n),适用于小规模数据集。
2. 二分查找:在有序的数据集中,将目标元素与中间元素进行比较,缩小查找范围,直到找到目标元素或范围为空。
时间复杂度为O(logn),适用于大规模数据集。
3. 哈希查找:利用哈希函数将元素映射到一个确定的位置,通过该位置快速查找目标元素。
时间复杂度为O(1),但需要额外的空间存储哈希表。
三、图算法图算法用于解决图论中的问题,常用于描述事物之间的关系和网络结构。
常见的图算法有:深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(Dijkstra算法、Floyd-Warshall算法)等。
C编程题目算法大全
曾经在软通动力写过的算法题其中有一小部分是参考网上的资料,现在拿出来给大家分享!第3章控制语句/* 1、打印出所有的“水仙花数”。
所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。
例如,153是一水仙花数,因为153 = 13 + 53 + 33。
*/#include<iostream.h>void main(){int i, a=0, b=0, c=0;for(i=100;i<1000;i++){a=i%10;b=i/10%10;c=i/100%10;if(a*a*a+b*b*b+c*c*c==i)cout<<"i="<<i<<endl;}}/* 2、一个数如果恰好等于它的因子之和,这个数就称为“完数”。
例如,6的因子为1、2、3,而6 = 1 + 2 + 3,因此6是“完数”。
编程序找出1000之内的所有完数,并按下面的格式输出其因子:6 -〉1,2,3 */#include<iostream.h>void main(){int i,j,sum=0,a[50],k,t;for(i=1;i<=1000;i++){sum=0;for(j=1;j<i;j++){if(i%j==0){sum+=j;a[k++]=j;}}t=k;if(sum==i){cout<<i<<"->";for(k=0;k<t;k++){cout<<a[k];if(k<t-1)cout<<",";}cout<<endl;}k=0;}}/* 3、求Sn=a+aa+aaa+…+aa…a之值,其中a是一个数字。
例如:2+22+222+…+22222(此时n=5),n由键盘输入。
*/#include<iostream.h>void main(){double a,sn=0.0,sum=0.0;int n,i;cout<<"please input a number";cin>>a;cout<<"please input n number";cin>>n;sn=a;sum=a;for(i=2;i<=n;i++){sum=sum*10+a;sn+=sum;}cout<<"Sn="<<sn<<endl;}/* 4、一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下。
c课课程设计以及源代码
c 课课程设计以及源代码一、教学目标本课程的教学目标是使学生掌握C语言的基本语法、数据结构和算法,培养学生编程思维和解决问题的能力。
具体目标如下:1.知识目标:(1)理解C语言的基本语法,包括变量、数据类型、运算符、表达式等;(2)掌握函数的定义和调用,了解作用域规则;(3)熟悉数组的声明和使用,理解字符串的基本操作;(4)了解指针的概念和应用,掌握指针与数组、指针与函数的关系;(5)学习结构体和联合体,掌握文件操作的基本方法。
2.技能目标:(1)能够运用C语言编写简单的程序,实现输入输出、数据处理等功能;(2)学会使用调试工具,能够发现和解决程序中的错误;(3)掌握常用的算法,如排序、查找、递归等,并能够灵活运用;(4)具备一定的编程规范和编程习惯,能够阅读和理解他人的代码。
3.情感态度价值观目标:(1)培养学生对计算机科学的兴趣和好奇心,激发学生主动学习的动力;(2)培养学生团队合作的精神,学会与他人交流和分享;(3)培养学生勇于面对困难和挑战,培养解决问题的能力;(4)培养学生具有良好的职业操守,注重诚信和责任心。
二、教学内容根据课程目标,本课程的教学内容主要包括以下几个方面:1.C语言的基本语法:变量、数据类型、运算符、表达式、函数等;2.数据结构:数组、字符串、指针、结构体、联合体等;3.算法:排序、查找、递归等常用算法;4.文件操作:文件的打开、关闭、读写等基本操作;5.编程实践:编写简单的程序,锻炼编程能力和解决问题的能力。
三、教学方法为了达到课程目标,本课程将采用多种教学方法,包括:1.讲授法:通过讲解和演示,使学生掌握C语言的基本语法和数据结构;2.讨论法:学生进行小组讨论,培养学生的团队合作能力和解决问题的能力;3.案例分析法:分析典型的编程案例,使学生了解C语言在实际应用中的重要性;4.实验法:让学生动手编写程序,培养学生的编程能力和实践能力。
四、教学资源为了支持教学内容和教学方法的实施,本课程将准备以下教学资源:1.教材:选用权威、实用的C语言教材,为学生提供系统的学习资料;2.参考书:提供相关的参考书籍,丰富学生的知识体系;3.多媒体资料:制作课件、教学视频等,增强课堂教学的趣味性和生动性;4.实验设备:提供计算机实验室,让学生进行编程实践和实验操作。
数值计算课程设计程序代码
这是本人做的数值计算课程设计的程序源代码。
代码均为C++语言编写。
前面十个程序代码分别为十种数值算法,最后一个程序代码头文件“matrix.h”的源代码。
这十个程序有大部分要用到头文件“matrix.h”,具体请查看程序的头文件包含申明语句。
这个头文件中包含矩阵常用运算的函数,可像matlab中一样方便的使用矩阵。
1.二分法解非线性方程#include<iostream>#include<cmath>using namespace std;//二分法解非线性方程double F(double x) //待解的f(x){ return x*sin(x)-1;}int main(){double a,b,ya,yb,delta,t,yt,err;cout<<"请依次输入区间(a,b)的左右端点值及精度要求delta : ";cin>>a>>b>>delta;int i,max1;ya=F(a); yb=F(b);if(ya*yb>0)return 0;max1=1+int(log(b-a)-log(delta)/log(2));for(i=1;i<=max1;i++){t=(a+b)/2;yt=F(t);if(yt==0){a=t;b=t;}else if(yb*yt>0){b=t;yb=yt;}else{a=t;ya=yt;}if(b-a<delta)break;}t=(a+b)/2;err=fabs(a-b);cout<<"方程的解为:"<<t<<endl;cout<<"误差: err = "<<err<<endl;return 0;}2.高斯列主元消去法解线性方程组#include<iostream>#include"matrix.h"using namespace std;//高斯列主元消去法解线性方程组int main(){matrix A,X; //A用来保存线性方程组的增广矩阵,X保存方程组的解int i,j,k,l,n;double temp;cout<<"请输入线性方程组的维数: n = "; cin>>n;A(n,n+1); cout<<"请输入线性方程组的增广矩阵:\n A = "<<endl;A.input();for(i=1;i<=n;i++) //行变换为上三角形{temp=A(i,i); k=0;for(j=i+1;j<=n;j++) //选列主元{if(fabs(A(j,i))>fabs(temp)){temp=A(j,i);k=j;}}if(k>i)A.M_h(i,k); //选主元后行交换for(j=i+1;j<=n;j++){temp=-A(j,i)/A(i,i);A.M_h(temp,i,j);}}//cout<<"测试:A=\n";A.print(8);for(i=n;i>=1;i--) //回代求解{temp=0;for(j=1;j<=n-i;j++)temp+=A(i,i+j)*X(i+j);X(i)=(A(i,n+1)-temp)/A(i,i);}cout<<"线性方程组的解为(从x1到xn顺序排列): \nX = "<<endl;X.print(8);return 0;}3.龙贝格积分算法#include<iostream>#include"matrix.h"using namespace std;//龙贝格积分算法double F(double x)//被积函数{return (x*x+x+1)*cos(x);}double power(double a,int n) //a的n次方{double temp=1;for(int i=0;i<n;i++)temp*=a;return temp;}int main(){matrix R; //R为龙贝格积分表double a,b,tol,err=1,x,h,s;int i,n,m=1,j,k;cout<<"请依次输入下限a,上限b,精度tol,积分表行数n: ";cin>>a>>b>>tol>>n;h=b-a;R=E(n);R(1,1)=(F(a)+F(b))*h/2;for(i=1;i<n&&err>tol;i++){h=h/2;s=0;for(j=1;j<=m;j++){x=a+h*(2*j-1);s+=F(x);}R(i+1,1)=R(i,1)/2+h*s;m=2*m;for(k=1;k<=i;k++){R(i+1,k+1)=R(i+1,k)+(R(i+1,k)-R(i,k))/(power(4,k)-1);}err=fabs(R(i,i)-R(i+1,k)); //注意:结束循环时,k=i+1。
算法设计与分析代码
算法设计与分析代码(java)N后问题import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class NQueen {/*** @param args*/static int n;static int[] x;static long sum;public static long nQueen(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;}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++;System.out.println("第"+sum+"种有效方案:");for(int i=1;i<=n;i++){System.out.print("--第"+i+"行上皇后在第"+x[i]+"列");}System.out.println("");}elsefor (int i = 1; i <= n; i++) {x[t] = i;if (place(t))backtrack(t + 1);}}public static void main(String[] args) throws NumberFormatException, IOException { System.out.println("请输入皇后的个数");BufferedReader strinH=new BufferedReader(new InputStreamReader(System.in));int num=Integer.parseInt(strinH.readLine());nQueen(num);System.out.println("一共"+sum+"个有效方案");}}0—1背包问题public class packge {public static void knapsack(int []v,int []w,int c,int [][]m){int n=v.length-1;int jMax=Math.min(w[n]-1,c);for(int j=0;j<=jMax;j++)m[n][j]=0;for(int j=w[n];j<=c;j++)m[n][j]=v[n];for(int i=n-1;i>1;i--){jMax=Math.min(w[i]-1,c);for(int j=0;j<=jMax;j++)m[i][j]=m[i+1][j];for(int j=w[i];j<=c;j++)m[i][j]=Math.max(m[i+1][j],m[i+1][j-w[i]]+v[i]);}m[0][c]=m[1][c];if(c>=w[0])m[0][c]=Math.max(m[0][c],m[1][c-w[0]]+v[0]);System.out.println(m[0][c]);}public static void traceback(int [][]m,int []w,int c, int []x) {int n=w.length-1;for(int i=1;i<n;i++)if(m[i][c]==m[i+1][c])x[i]=0;else{x[i]=1;c-=w[i];}x[n]=(m[n][c]>0)?1:0;}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubint [] ww= {2,2,6,5,4};int [] vv= {6,3,5,4,6};int [][] mm=new int[11][11];knapsack(ww,vv,10,mm);int [] xx=new int[ww.length];traceback(mm,ww,10,xx);for(int i=0;i<xx.length;i++)System.out.println(xx[i]);}}public class Knapsack{public static void knapsack(int[] v, int[] w, int c, int[][] m) {int n = v.length-1;/** v[] w[] c 分别是价值、重量数组和背包容量, m[i][j]表示只有w[i],w[i+1]...w[n]这些物品时,背包容量为j时的最大价值。
常用c算法代码
堆石子游戏的问题(多元Huffman编码)问题描述:在一个操场的四周摆放着n 堆石子。
现要将石子有次序地合并成一堆。
规定每次至少选2 堆最多选k堆石子合并成新的一堆,合并的费用为新的一堆的石子数。
试设计一个算法,计算出将n堆石子合并成一堆的最大总费用和最小总费用。
编程任务:对于给定n堆石子,编程计算合并成一堆的最大总费用和最小总费用。
Input测试数据的第1 行有2个正整数n和k,表示有n堆石子,每次至少选2堆最多选k堆石子合并。
第2行有n个数,分别表示每堆石子的个数。
Output输出最大总费用和最小总费用,用一空格隔开,每个答案一行。
Sample Input7 345 13 12 16 9 5 22Sample Output593 199代码:#include<iostream>#include<algorithm>#include<vector>using namespace std;bool cmp(int a, int b){return a>b;}void Insert(vector<int> &f, int pos, int value) {for (int i = f.size() - 1; i > pos; i--){f[i] = f[i - 1];}f[pos] = value;}int Find(vector<int> f, int value){int pos = f.size() - 1;while (pos >= 0 && f[pos] < value){pos--;}return pos + 1;}int MaxNum(vector<int> f){sort(f.begin(), f.end());int Max;Max = 0;while (f.size() >= 2){int sum = f[f.size() - 1] + f[f.size() - 2];Max = Max + sum;f.resize(f.size() - 1);f[f.size() - 1] = sum;}return Max;}int MinNum(vector<int> f, int len){sort(f.begin(), f.end(), cmp);int Min;Min = 0;while (f.size() >= len){int sum = 0;for (int i = f.size() - 1; i >= f.size() - len && i >= 0; i--) {sum = sum + f[i];}Min = Min + sum;f.resize(f.size() - len + 1);if (f.size() > len){int pos = Find(f, sum);Insert(f, pos, sum);}else if (f.size() != 1)f[f.size() - 1] = sum;for (int i = 0; i < f.size(); i++){Min = Min + f[i];}break;}else{break;}}return Min;}bool run(){int n, m;if (!(cin >> n >> m)) return false;vector<int> f(n);for (int i = 0; i < n; i++)cin >> f[i];}int Max, Min;Max = MaxNum(f);while (f.size() % (m - 1) != 1){f.push_back(0);}Min = MinNum(f, m);cout << Max << " " << Min << endl;return true;}int main(){while (run());return 0;} ——————————————————————————————————————————————————登山机器人问题问题描述:登山机器人是一个极富挑战性的高技术密集型科学研究项目,它为研究发展多智能体系统和多机器人之间的合作与对抗提供了生动的研究模型。
常用算法经典代码(C版)
常用算法经典代码(C++版)一、快速排序void qsort(int x,int y) //待排序的数据存放在a[1]..a[n]数组中{int h=x,r=y;int m=a[(x+y)>>1]; //取中间的那个位置的值while(h<r){while (a[h]<m) h++; //比中间那个位置的值小,循环直到找一个比中间那个值大的while (a[r]>m) r--; //比中间那个位置的值大,循环直到找一个比中间那个值小的if(h<=r){int temp=a[h];//如果此时h<=r,交换a[h]和a[r]a[h]=a[r];a[r]=temp;h++;r--; //这两句必不可少哦}}if(r>x) qsort(x,r);//注意此处,尾指针跑到前半部分了if(h<y) qsort(h,y); //注意此处,头指针跑到后半部分了}调用:qsort(1,n)即可实现数组a中元素有序。
适用于n比较大的排序二、冒泡排序void paopao(void) //待排序的数据存放在a[1]..a[n]数组中{for(int i=1;i<n;i++) //控制循环(冒泡)的次数,n个数,需要n-1次冒泡for(int j=1;j<=n-i;j++) //相邻的两两比较if(a[j]<a[j+1]) {int temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}或者void paopao(void) //待排序的数据存放在a[1]..a[n]数组中{for(int i=1;i<n;i++) //控制循环(冒泡)的次数,n个数,需要n-1次冒泡for(int j=n-i;j>=1;j--) //相邻的两两比较if(a[j]<a[j+1]) {int temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}调用:paopao(),适用于n比较小的排序三、桶排序void bucketsort(void)//a的取值范围已知。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void list::mergepass(int arrayx[],int arrayy[],int s)
{
int i=0;
while(i<=N-2*s)
{
merge(arrayx,arrayy,i,i+s-1,i+2*s-1);
i=i+2*s;
}
if((i+s)<N)
merge(arrayx,arrayy,i,i+s-1,N-1);
arrayd[k++]=arrayc[i++];
else arrayd[k++]=arrayc[j++];
if(i>m)
for(int q=j;q<=r;q++)
arrayd[k++]=arrayc[q];
else
for(int q=i;q<=m;q++)
arrayd[k++]=arrayc[q];
f.mergesort (f.array);
f.diaplay (a);
}
合并排序:2
#include <iostream>
usingnamespace std;
void MERGES(int *A,int p,int q,int r) //下标P<=q<r
{
int n1=q-p+1; //n1:p,q之间的数的个数
else
for(int j=i;j<N;j++)
arrayy[j]=arrayx[j];
}
void list::mergesort(int array1[])
{
int array2[N];
int s=1;
while(s<N)
{
mergepass(array1,array2,s);
s+=s;
mergepass(array2,array1,s);
}
合并排序3:
#include <iomanip.h>
#include <iostream.h> //这个函数将b[0]至b[right-left+1]拷贝到a[left]至a[right]
template <class T>
void Copy(T a[],T b[],int left,int right)
for(int y=0;y<x;y++)
{
cin>&<"请输入上下限p,r"<<endl;
cin>>p>>r;
MERGESORT(A,p,r);
cout<<"合并排序后为:"<<endl;
for (int m=p;m<=r;m++)
{
cout<<A[m];
}
delete []A;
{
int a1cout=left,//指向第一个数组开头
a1end=i,//指向第一个数组结尾
a2cout=i+1,//指向第二个数组开头
a2end=right,//指向第二个数组结尾
bcout=0;//指向b中的元素
for(int j=0;j<right-left+1;j++)//执行right-left+1次循环
}
L[n1]=10000; //设置哨兵
R[n2]=10000;
i=0;
j=0;
for (k=p-1;k<r;k++)
{
if (L[i]<=R[j])
{
A[k]=L[i];
i=i+1;
}
else
{
A[k]=R[j];
j=j+1;
}
}
}
void MERGESORT(int *A,int p,int r)
合并排序1:
#include<iostream>
using namespace std;
const int N=100;
class list
{
public:
int array[N];
void input(int a);
void merge(int arrayc[],int arrayd[],int l,int m,int r);
{
int size=right-left+1;
for(int i=0;i<size;i++)
{
a[left++]=b[i];
}
} //这个函数合并有序数组a[left:i],a[i+1:right]到b,得到新的有序数组b
template <class T>
void Merge(T a[],T b[],int left,int i,int right)
int n2=r-q; //n2:q以后到r的数的个数
int *L=newint [n1+1], //动态申请两个子数组
*R=newint [n2+1];
int i,j,k;
for (i=0;i<n1;i++)
{
L[i]=A[p+i-1];
}
for (j=0;j<n2;j++)
{
R[j]=A[q+j];
for(int i=0;i<a;i++)
cin>>array[i];
}
void list::merge(int arrayc[],int arrayd[],int l,int m,int r)
{
int i=l;
int j=m+1;
int k=l;
while((i<=m)&&(j<=r))
if(arrayc[i]<=arrayc[j])
s+=s;
}
}
void list::diaplay(int a)
{
for(int i=N-a;i<N;i++)
cout<<array[i];
}
void main()
{
list f;
int a;
cout<<"请输入要合并排序的数组大小:(数组最大上限100)"<<endl;
cin>>a;
f.input(a);
void mergepass(int arrayx[],int arrayy[],int s);
void mergesort(int array1[]);
void diaplay(int a);
};
void list::input(int a)
{
cout<<"Please input shorted array:"<<endl;
{
if (p<r)
{
int q=(p+r)/2;
MERGESORT(A,p,q);
MERGESORT(A,q+1,r);
MERGES(A,p,q,r);
}
}
void main()
{
int x,z,p,r;
cout<<"请输入数组长度"<<endl;
cin>>x;
int *A= newint[x];
cout<<"请输入数组的元素"<<endl;
{
if(a1cout>a1end)
{
b[bcout++]=a[a2cout++];
continue;
}//如果第一个数组结束,拷贝第二个数组的元素到b
if(a2cout>a2end)