牛客网学习笔记(HJ61 放苹果)

157 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目来自牛客网的华为机试题库,本题目为简单题HJ61 放苹果

HJ61 放苹果

描述 把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法? 注意:如果有7个苹果和3个盘子,(5,1,1)和(1,5,1)被视为是同一种分法。

输入描述: 输入两个int整数 输出描述: 输出结果,int型

示例1

输入:
		7 3
输出:
		8

动态规划

def f(m,n):
    if m<0 or n<0:
        return 0
    elif m==1 or n==1:
        return 1
    else:
        return f(m,n-1)+f(m-n,n)
while True:
    try:
        m,n=map(int,input().split())
        print(f(m,n))
    except:
        break

解析

看到允许有的盘子空着不放,就应该想到用动态规划,因为当有一个盘子是空的时候对应的摆放情况就是少一个盘子时所有的情况了,当每个盘子都摆满时,也就是每个盘子摆一个,剩下的再分到剩下的盘子里
具体方法:
1.当只有一个盘子的时候不管有几个苹果只有一种分法,同样的只有一个苹果的时候不管有几个盘子也只有一种分法。
2.盘子数和苹果数都大于1时,假设有盘子数为m、苹果数为n,则有f(m,n)=f(m,n-1)+f(m-n,n)种分法,依次递减直到有一个输入为1后根据f(m,1)=1,f(1,n)=1得出f(m,n)的值
3.f(m,n)就是盘子数为m、苹果数为n时的放苹果的情况数,输出即可

其实作为外行,刚刚开始写这种题的时候觉得动态规划很难理解,虽然现在掌握的也不是很好,但是相比于刚刚接触的时候有了提高,感觉多练确实量变会引起质变,加油啊!