P1255 数楼梯

题目描述

楼梯有 NN 阶,上楼可以一步上一阶,也可以一步上二阶。

编一个程序,计算共有多少种不同的走法。

输入格式

一个数字,楼梯数。

输出格式

输出走的方式总数。

输入输出样例

输入 #1复制

4

输出 #1复制

5

说明/提示

  • 对于 60\%60% 的数据,N \leq 50N≤50;
  • 对于 100\%100% 的数据,N \leq 5000N≤5000。
    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    using namespace std;
    int n,len=1,f[5003][5003];//f[k][i]--第k阶台阶所对应的走法数 
    void hp(int k)//高精度加法,k来存阶数 
    {    
        int i;
        for(i=1;i<=len;i++)
         f[k][i]=f[k-1][i]+f[k-2][i];//套用公式  斐波那契数列 
        for(i=1;i<=len;i++)             //进位 
         if(f[k][i]>=10)
         {
             f[k][i+1]+=f[k][i]/10;   //进位 
             f[k][i]=f[k][i]%10;
             if(f[k][len+1])len++;    //判断最高位是否满足进位 
        }
    }
    int main()
    {
        int i;
        scanf("%d",&n);           //N阶楼梯 
        f[1][1]=1; f[2][1]=2;         //初始化 
        for(i=3;i<=n;i++)              //从3开始避免越界 
         hp(i);                         
        for(i=len;i>=1;i--)             //逆序输出 
         printf("%d",f[n][i]);
        return 0;
    }

    题目背景

    uim神犇拿到了uoira(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种。

    uim指着墙上的价目表(太低级了没有菜单),说:“随便点”。

    题目描述

    不过uim由于买了一些辅(e)辅(ro)书,口袋里只剩MM元(M \le 10000)(M≤10000)。

    餐馆虽低端,但是菜品种类不少,有NN种(N \le 100)(N≤100),第ii种卖a_iai​元(a_i \le 1000)(ai​≤1000)。由于是很低端的餐馆,所以每种菜只有一份。

    小A奉行“不把钱吃光不罢休”,所以他点单一定刚好吧uim身上所有钱花完。他想知道有多少种点菜方法。

    由于小A肚子太饿,所以最多只能等待11秒。

    输入格式

    第一行是两个数字,表示NN和MM。

    第二行起NN个正数a_iai​(可以有相同的数字,每个数字均在10001000以内)。

    输出格式

    一个正整数,表示点菜方案数,保证答案的范围在intint之内。

    输入输出样例

    输入 #1复制

    4 4
    1 1 2 2
    

    输出 #1复制

    3
    

    说明/提示

    2020.8.29,增添一组 hack 数据 by @yummy

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    using namespace std;
    int a[101],f[101][10001];
    int main()
    {
      int n,m;
      cin>>n>>m;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
        if(a[i]>j) f[i][j]=f[i-1][j];
        if(a[i]==j) f[i][j]=f[i-1][j]+1;
        if(a[i]<j) f[i][j]=f[i-1][j]+f[i-1][j-a[i]];
    }
        cout<<f[n][m];
        return 0;
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值