放苹果问题 POJ 1664

本文探讨了M个苹果分配到N个盘子的不同方法数量的计算问题,并提供了一个递归算法实现。对于特定条件(如M=7,N=3),文章详细解释了如何避免重复计数,并给出了完整的C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

M个苹果放到N个盘子里一共会有多少种不同的方法。比如在M=7,N = 3的情况中,(1 5 1) (5 1 1)是同一种情况。

 
f(1, N) = 1
f(M, 1) = 1
 
当N > M时,也就是说苹果一定不能把所有的盘子都占用,那么它与用N-1个盘子的结果是一样的。
f(M, N) = f(M, N - 1)
当N <= M时,分为两种情况,第一种情况是说有的盘子都占了,每个至少放一个,剩下M-N个苹果放到N个盘子里;第二种情况没有全部用到,就是将M个苹果放到N-1个盘子里。
f(M, N) = f(M-N, N) + f(M, N-1)
 
 
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int f(int M, int N)
 5 {
 6     if(M == 1 || N == 1) return 1;
 7     else if(N > M) return f(M, N-1);
 8     else return f(M-N, N) + f(M, N-1);
 9 }
10 
11 int main()
12 {
13     int M, N, num;
14     cin >> num;
15     for(int i = 0; i < num; i++) {
16         cin >> M >> N;
17         cout << f(M, N) << endl;
18     }
19     return 0;
20 }

 

转载于:https://www.cnblogs.com/li-qiang/p/3753992.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值