放苹果(HJ61)

一:解题思路

f(m,n) 为m个苹果,n个盘子的方法数目。

递归出口说明:当m=0 || n=1 只有一种放法。

当n>m时:必定至少有n-m个盘子永远空着,去掉他们对摆放苹果数目不产生影响。即 if(n>m) f(m,n)=f(m,m)

当n<=m时:不同的方法可以分成2类:

1.至少一个盘子空着,即相当于f(m,n)=f(m,n-1)

2.所有盘子都有苹果,相当于可以从每个盘子中拿掉一个苹果,不影响不同的方法的数目,即f(m,n)=f(m-n,n)

二:完整代码示例 (C++版和Java版)

C++:

#include <iostream>

using namespace std;

int apples(int m, int n)
{
    if (m == 0 || n == 1)
        return 1;
    if (m < n)
        return apples(m, m);
    else
        return apples(m, n - 1) + apples(m-n,n);
}

int main()
{
    int m = 0;
    int n = 0;

    while (cin >> m >> n)
    {
        cout << apples(m,n) << endl;
    }

    return 0;
}

放苹果(HJ61)

上一篇:js里面如何获取手机机型、系统版本等信息


下一篇:Post请求的两种编码格式:application/x-www-form-urlencoded和multipart/form-data