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]);
    
        }
    }
    
    低调做人,高调做事。
  • 相关阅读:
    【LeetCode OJ】Remove Element
    【LeetCode OJ】Remove Duplicates from Sorted Array
    【LeetCode OJ】Swap Nodes in Pairs
    【LeetCode OJ】Merge Two Sorted Lists
    【LeetCode OJ】Remove Nth Node From End of List
    【LeetCode OJ】Two Sum
    【LeetCode OJ】Majority Element
    最长公共子序列问题
    php fopen与file_get_contents的区别
    PHP 技巧集合
  • 原文地址:https://www.cnblogs.com/Asimple/p/5528665.html
Copyright © 2011-2022 走看看