题解 | 递归#放苹果#

放苹果

http://www.nowcoder.com/practice/bfd8234bb5e84be0b493656e390bdebf

递归思路:

  • 需要返回的结果: f(m,n)(方法数量)
  • 按照n,m 分为两种情况:
    • n>m:需要去掉n-m个盘子,故:f(m,n)=f(m,m)
    • n<=m: 考虑两种互斥事件(形成m,n可以每次递归递减的情况):
      • 每个盘子至少放一个: f(m,n) = f(m-n,n)
      • 至少有一个盘子是空的: f(m,n) = f(m,n-1)
  • 退出递归的条件(题目条件** 0<=m<=10, 1<=n<=10**):
    • m 一直递减,直至苹果 m=0: 说明盘子已经全部完成放置,f(m,n)=1 (m=0可理解为0个苹果放到n个盘子里,只有一种方法,边界条件)
    • n 一直递减,直至苹果 n=1: 剩余苹果全部放在这个盘子里, f(m,n)=1
def f(m,n):
    if m ==0 or n==1:
        return 1
    elif n > m:
        return f(m,m)
    else:
        return f(m-n,n)+f(m,n-1)
while True:
    try:
        m,n = list(map(int,input().split()))
    except:
        break
    else:
        print(f(m,n))
全部评论

相关推荐

10-30 22:18
已编辑
毛坦厂中学 C++
点赞 评论 收藏
分享
5 1 评论
分享
牛客网
牛客企业服务