1、正整数n的划分算法
int split(int n,int m){    if(n==1||m==1) return 1;    else if(n
2、对于给定的包含n个元素的数组a[0:n-1],要求从中找出第k小的元素
#define NUM 1001int a[NUM];int select(int left,int right,int k){    int (left>=right)return a[left];    int i=left;    int j=right+1;    int pivot=a[left];    while(true){        do{            i=i+1;        }while(a[i]
3、整数因子分解
#include
  4、半数集问题
 半数集递归算法
int comp(int n){ int ans=1; if(n>1) for(int i=1;i<=n/2;i++) ans+=comp(i); return ans;}
记忆式搜索
#include
int main(){    int n;    while(cin>>n){        memset(a,0,sizeof(a));        a[1]=1;        cout<
  5、输油管道问题
 采用分治算法计算中位数
#include
采用排序算法计算中位数
#include
6、取余运算
#include
7、集合全排列
#include  int main(){    int list[5]={1,2,3,4,5};    Perm(list,0,3);    return 0;}   8、矩阵连乘问题 #define NUM 51int p[NUM];int m[NUM][NUM];int s[NUM][NUM];void MatrixChain(int n){    for(int i=1;i<=n;i++)        m[i][i]=0;    for(int r=2;r<=n;r++)        for(int i=1;i<=n;i++){                int j=i+r-1;                m[i][j]=m[i+1][j]+p[i-1]*[p[i]*p[i];                s[i][j]=i;                for(int k=i+1;k   9、最长公共子序列 #define NUM 100int c[NUM][NUM];int b[NUM][NUM];void LCSLength(int m,int n,const char x[],char y[]){    int i,j;    for(i=1;i<=m;i++)        c[i][0]=0;    for(i=1;i<=n;i++)        c[0][i]=0;    for(i=1;i<=m;i++)    for(j=1;j<=n;j++){        if(x[i]==y[j]){            c[i][j]=c[i-1][[j-1]+1;            b[i][j]=1;        }        else if(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;        }    }}   10、最大子段和 #define NUM 101int a[NUM];int MaxSum(int n){    int sum=0;    int b=0;    for(int i=1;i<=n;i++){        if(b>0)            b+=a[i];        else b=a[i];        if(b>sum)            sum=b;    }    return sum;}   11、最大子段和的最优解 #define NUM 101int a[NUM];int MaxSum(int n,int &besti,int &bestj){    int sum=0;    int b=0;    int begin=0;    for(int i=1;i<=n;i++){        if(b>0)            b+=a[i];        else{                b=a[i];                begin=i;        }        if(b>sum){            sum=b;            besti=begin;            bestj=i;        }    }    return sum;}   12、0—1背包问题 #define NUM 50#define CAP 1500int w[NUM];int v[NUM];int p[NUM][CAP];void knapsack(int c,int n){    int jMax=min(w[n]-1,c);    for(int j=0;j<=jMax;j++)        p[n][j]=0;    for(int j=w[n];j<=c;j++)        p[n][j]=v[n];    for(int i=n-1;i>1;i--){        jMax=min(w[n]-1,c);        for(int j=0;j<=jMax;j++)            p[i][j]=p[i+1][j];        for(int j=w[n];j<=c;j++)            p[i][j]=max(p[i+1][j],p[i+1][j-w[n]]+v[i]);    }    p[1][c]=p[2][c];    if(c>=w[1])        p[1][c]=max(p[1][c],p[2][c-w[n]]+v[1]);}   0—1背包最优解 void traceback(int c,int n,int x[]){    for(int i=1;i   13、最长单调递增子序列 #define NUM 100int a[NUM];int Lls_n2(int n){    int b[NUM]={0};    int i,j;    b[1]=1;    int max=0;    for(i=2;i<=n;i++){        int k=0;        for(j=1;j   14、数字三角形问题 #define NUM 100int tri[NUM][NUM];int triangle(int n){    int i,j;    for(i=n-2;i>=0;i--)    for(j=0;j<=i;j++){        if(tri[i+1][j]>tri[i+1][j+1])            tri[i][j]+=tri[i+1][j];        else tri[i][j]+=tri[i+1][j+1];    }    return tri[0][0];}   15、Human Gene Functions cin>>first>>secend;gene[0][0]=0;for(i=1;i<=secend;i++)    gene[0][i]=gene[0][i-1]+score[4][map[str2[i-1]]];for(i=1;i<-first;i++)    gene[i][0]=gene[i-1][0]+score[map[str1[i-1]]][4];int m1,m2,m3;for(i=1;i<=first;i++)   for(j=1;j<=secend;j++){        m1=gene[i-1][j]+score[map[str1[i-1]]][4];        m2=gene[i][j-1]+score[4][map[str2[i-1]]];        m3=gene[i-1][j-1]+score[map[str1[i-1]][map[str2[i-1]]];} FatMouses Speedstruct mouse{    int weight,speed,id;}mice[1001];   //排序因子 int cmp(const void *a,const void *b){    mouse*ta=(mouse*)a;    mouse*tb=(mouse*)b;    if(ta->weight==tb->weight)        return tb->speed-ta->speed;    return ta->weight-tb->weight;}   //最长单调递增子序列算法 int count[1001]={0};int path[1001]={0};count[1]=1;for(int i=2;i   // 查找最大的序列长度 int max=0;int pos;for(int i=1;i   16、活动安排问题 struct action{    int s;    int f;    int index;}bool cmp(coust action &a,const action &b){    if(a.f<=b.f)        return true;    return false;}void GreedySelector(int n,action a[],bool b[]){    b[1]=true;    int preEnd=1;    for(int i=2;i<=n;i++)    if(a[i].s>=a[preEnd].f){        b[i]=true;        preEnd=i;    }}   17、背包问题 struct bag{    int w;    int v;    double c;}a[1001];bool cmp(bag a,bag b){    return a.c>=b.c;}double knapsack(int n, bag a[],double c){    double cleft=c;    int i=0;    double b=0;    while(i   18、Wooden Sticks #define maxN 5001struct stick{    int l;    int w;};stick data[maxN];int cmp(stick a,stick b){    if(a.l==b.l)        return a.w   19、Gone Fishing void greedy(int pos,int time){    if(time<=0)        return;    int i,j;    int fish[MAXN];    int p[MAXN];    int t=0;    for(i=0;i   20、回溯法-装载问题 void Backtrack(int t){    if(t>n){        f(cw>bestw){            for(int i=1;i<=n;i++)                bestx[i]=x[i];            bestw=cw;        }        return;    }    r-=w[t];    if(cw+w[t]<=c){        x[t]=1;        cw+=w[t];        Backtrack(t+1);        cw-=w[t];    }    if(cw+r>bestw){        x[t]=0;        Backtrack(t+1);    }    r+=w[t];}   21、回溯法-0-1背包问题 struct Object{    int w;    int v;    double d;}Q[NUM];bool cmp(Object a,Object b){    if(a.d=b.d)        return true;    else return false;}void backtrack(int t){    if(i+1>n){        bestv=cv;        return;    }    if(cw+Q[i].w<=c){        cw+=Q[i].w;        cv+=Q[i].v;        backtrack(i+1);        cw-=Q[i].w;        cv-=Q[i].v;    }    if(Bound(i+1)>bestv)        backtrack(i+1);}int Bound(int i){    int cleft=c-cw;    int b=cv;    while(i   22、回溯法-n皇后问题 void Backtrack(int t){    int i;    if(t>n){        sum++;        for(i=1;i<=n;i++)            cout<   23、回溯法-旅行商问题 void Backtrack(int t){   if(t==n){    if(a[x[n-1]][x[n]]!=NoEdge&&a[x[n]][1]!=NoEdge&&       (cc+a[x[n-1]][x[n]]+a[x[n]][1]   24、装载问题 #define NUM 100int n;int c;int w[NUM];int MaxLoading(){    queue (int)Q;    Q.push(-1);    int i=0;    int Ew=0;    int bestw=0;    int r=0;    for(int j=1;j   25、Fire Net char cMap[5][5];int iBest;int n;void solve(int k,int current){    int x,y;    if(k==n*n){        if(current>iBest){            iBest=current;            return ;        }    }    else {        x=k/n;        y=k%n;        if(cMap[x][y]=='.'&&CanPut(x,y)){            cMap[x][y]='0';            solve(k+1,current+1);            cMap[x][y]='.';        }        solve(k+1,current);    }}bool CanPut(int row,int col){    int i;    for(i=row-1;i>=0;i--){        if(cMap[i][col]=='0')            return false;        if(cMap[i][col]=='X')            break;    }    for(i=col-1;i>=0;i--){        if(cMap[row][i]=='0')            return false;        if(cMap[row][i]=='X')            break;    }    return true;}