天天看点

算法复习笔记之重要算法(一)算法复习笔记之重要算法(一)

算法复习笔记之重要算法(一)

序言:这次对于这部分进行了修改,一是为了备考,也顺便梳理以下算法的一些,同时交待一下总共需要介绍的算法总类

分类:

KMP、0/1背包(0,1位向量)、 任务分配问题

数字螺旋方阵、归并排序、最大字段和(蛮力、分治、动态)

折半查找、选择问题

数塔问题、 最长公共子序列、

付款问题、钱币兑换、背包问题、多机调度算法

目录:

    1.斐波那契

    2.钱币问题

主要算法介绍:

    一、求斐波那契数列的第N项

        1.1 斐波那契数数列的性质:

        方法:

              1.1.1 递推

              1.1.2递归

              1.1.3动态规划

              1.1.4数学方法

   1.1.1递推方法代码:

#include<iostream>
usaing namespace std;
int main()
{
    int n,a,b,t,i;
    a=1;b=1;
    scanf("%d",&n);
    if(n==1||n==2)
        coutMM1<<endl;
    else
    {
        for(i-1;i<=n;i++)
        cout<<t<<endl;
    }
    return 0;
}
           

1.1.2 递归方式

#include<iostream>
using namespace std;
int f(int k)
{
    if(k<=2) return 1;
    else
 return f(k-1)+f(k-2);
}

 int main()
{
    int n,a,b,i;
    a=1;b=1;
    cin>>n;
    cout<<(n)<<endl;
     return 0;
}
           

1.1.3 动态规划

#include<iostream>
using namespace std;
const int n=20;
int a[n]={0,1,1};
 int main()
{
    int n,i;
    scanf("%d",&n);
    for(i=3;i<=n;i++)
        a[i]=a[i-1]+a[i-2];
    cout<<a[n]<<endl;
    return 0;
 }
           

1.1.4 数学公式

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int n,i;
    float t;
    scanf("%d",&n);
    t=(pow(1+sqrt(5)/2,n)-pow((1-sqrt(5)/2),n))/sqrt(5);
    printf("%.0f\n",t);
    return 0;
 }
           

二、钱币兑换”问题

    2.1枚举法

#include<iostream>
using namespace std;
int main()
{
    int x,y,z,total=0;
    for(x=0;x<=100;x++)
        for(y=0;y<=50;y++)
            for(z=0;z<=20;z++)
                if(x+2*y+5*z==100)
                    totol++;
    cout<<total<<endl;
    return 0;            
 }

           

   2.2 贪心法

#include<iostream>
using namespace std;
int main()
{
    int x,n,total=0;
    cin>>n;
    while(n>=5)
    {
        total++;
        n-=5;
    }
    while(n>2)    
    {
        total++;
        n-=2;
    }
    cout<<total<<endl;
    return 1;
 }
           

继续阅读