放苹果

放苹果_牛客网

https://www.nowcoder.com/practice/bfd8234bb5e84be0b493656e390bdebf?tpId=37&tqId=21284&rp=0&ru=/ta/huawei&qru=/ta/huawei/question-ranking

'''
放苹果分为两种情况,一种是有盘子为空,一种是每个盘子上都有苹果。
令(m,n)表示将m个苹果放入n个盘子中的摆放方法总数。
1.假设有一个盘子为空,则(m,n)问题转化为将m个苹果放在n-1个盘子上,即求得(m,n-1)即可
2.假设所有盘子都装有苹果,则每个盘子上至少有一个苹果,即最多剩下m-n个苹果,问题转化为将m-n个苹果放到n个盘子上
即求(m-n,n)
'''
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

#include <iostream>
using namespace std;
int f(int m,int n){
    if(m<0 || n<0)
        return 0;
    else if(m==1 || n==1)
        return 1;
    else
        return f(m,n-1)+f(m-n,n);
}
int main(){
    int m,n;
    while(cin >> m >> n){
        cout << f(m,n) << endl;
    }
    return 0;
}

全部评论
我觉得需要说清楚,0个盘子只有一种放法,就是什么都不放,这也算一种方案;同理,0个苹果也只有一种放法,就是所有盘子都不放苹果。这点需要说清楚,要不然不容易理解
1 回复 分享
发布于 2022-06-08 20:57
第一种情况准确地说应该是“至少有一个盘子为空”
28 回复 分享
发布于 2020-07-05 09:51
将m个苹果放入n个篮子里,允许有的篮子空着这个事件Z,包含两个互斥事件A和B,即A并B=U,A交B为空集;其中事件A为有的篮子空着,即至少有1个篮子空着;B为所有篮子都不空,即每个篮子都至少有1个苹果。理解了这个关系之后就可以像答主那样用DP的思想将事件A和B继续往下拆分了。
21 回复 分享
发布于 2020-12-07 19:41
怎么说明这两种情况就包含了所有情况
15 回复 分享
发布于 2020-03-01 15:58
我去,看到这个思路,秀啊
4 回复 分享
发布于 2022-03-02 14:17
要想到这样的方法真的要思路清奇,反正我不看解析完全想不到/(ㄒoㄒ)/~~
2 回复 分享
发布于 2022-06-09 00:31
假设有2个3个4个 盘子是空的呢
2 回复 分享
发布于 2022-04-09 22:59
m < 0 即 上一条件 m - n < 0,苹果数小于盘子数,在两种情况中选择一个分支让盘子减1直到盘子数等于苹果数(另一个分支结果一直是0)。盘子数等于苹果后再进行双分支分解问题。 if 条件中的 or n < 0 没有意义,去掉后不影响结果。由于分支1为 n - 1,在 n < 0 前n必定会等于1,return 1 。
2 回复 分享
发布于 2021-12-01 08:33
请问如何证明,这种算法没有重复计算?“5,1,1和1,5,1 是同一种分法”这样的情况需要去重吧
2 回复 分享
发布于 2021-08-26 15:47
m=0时意思是将0个苹果放入到n个盘子,也就是说苹果数<盘子数,那么无论怎么放都只有一种放法; n=0时意思是m个苹果将无处可放,或者说全是空盘子,这当然不算一种放法; m=n=0时意思是现在没有盘子了,也没有苹果了,这也不算一种放法; 所以完全写清楚应该是这样: func AssignApplesWays(m int,n int) int { fmt.Printf("m:%v,n:%v\n",m,n) if m < 0 || n < 0 { return 0 }else if m == 0 && n == 0 { return 0 } else if m == 0 { return 1 }else if n == 0 { return 0 } else if m == 1 || n == 1 { return 1 }else { return AssignApplesWays(m, n-1) + AssignApplesWays(m-n, n) } }
2 回复 分享
发布于 2021-08-02 00:01
if(m<0 || n<0) return 0; 如果这一句变成 if(m<=0 || n<=0) return 0; 就会失败
1 回复 分享
发布于 2021-04-17 16:45
if(m<0 || n<=0) return 0;
1 回复 分享
发布于 2020-09-18 10:29
分的结果有两种情况,一种是没有盘子为空,一种是有盘子为空,就是有0个盘子为空,那这种的分界线,就是有1个盘子为空,也就是某个盘子是空还是不空的两种情况。
点赞 回复 分享
发布于 07-04 14:39 陕西
漂亮啊。。。我咋没观测到这么巧妙的递归
点赞 回复 分享
发布于 2024-10-13 21:05 广东
m
点赞 回复 分享
发布于 2024-07-06 23:58 浙江
比如f(3,3)=3,但是按照这个算法f(3,3)=2
点赞 回复 分享
发布于 2024-03-25 18:30 广东
m == n 的情况不考虑不会报错吗,
点赞 回复 分享
发布于 2024-03-25 18:26 广东
不懂就问,一定要用try-except来执行吗?
点赞 回复 分享
发布于 2024-01-14 10:41 湖北
题目意思是当苹果和盘子数都不为0时,苹果必须放完,但是盘子可以不用完
点赞 回复 分享
发布于 2023-05-19 20:02 陕西
哪位大神解释下,这里map函数的作用是什么?
点赞 回复 分享
发布于 2023-05-09 12:19 陕西

相关推荐

评论
376
40
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务