zoukankan      html  css  js  c++  java
  • ACM题目————放苹果

    Description

    把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

    Input

    第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

    Output

    对输入的每组数据M和N,用一行输出相应的K。

    Sample Input

    1
    7 3
    

    Sample Output

    8

    这题有两种解法!当数据较小的时候,直接递归也可以AC。

    代码如下:

    //Asimple
    #include <stdio.h>
    #include <iostream>
    using namespace std;
    
    typedef long long ll ;
    int n, m, T;
    ll sum ;
    
    ll fun(int m, int n)
    {
        if( m == 0 || n==1 ) return 1 ;
        if( m < n ) return fun(m,m);
        else return fun(m,n-1) + fun(m-n,n);
    }
    
    int main()
    {
        cin >> T ;
        while( T -- )
        {
            scanf("%d%d",&m,&n);
            sum = fun(m,n);
            cout << sum << endl ;
        }
    
        return 0;
    }
    

    当数据太大的时候,用递归就有可能出现时间超限的问题了,于是,就有了以下解法(动态规划)!

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    using namespace std;
    int n,m;
    long long dp[1001][1001];
    int main()
    {
        for(int i=1; i<=1000; i++)
        {
            dp[i][1]=1;
            dp[i][0]=0;
            for(int j=1; j<=1000; j++)
            {
                dp[0][j]=1;
                if(i<j)
                    dp[i][j]=dp[i][j-1];
                else
                    dp[i][j]=dp[i][j-1]+dp[i-j][j];
            }
        }
        int t;
        cin>>t;
        while(t--)
        {
            scanf("%d%d",&n,&m);
            printf("%d
    ",dp[n][m]);
    
        }
    }
    
    低调做人,高调做事。
  • 相关阅读:
    git 简单操作
    JS中substr与substring的区别
    手写map, filter函数
    node之pipe
    nodejs之child_process
    node真的是单线程模式吗
    【xinsir】分享一个查找文件的脚手架
    【xinsir】函数库,持续更新
    数组循环方法统计
    20190916
  • 原文地址:https://www.cnblogs.com/Asimple/p/5528665.html
Copyright © 2011-2022 走看看