poj 1664 放苹果 递归

题目链接:

  http://poj.org/problem?id=1664

题目描述:

  有n个苹果,m个盒子,盒子和苹果都没有顺序,盒子可以为空,问:有多少种放置方式?

解题思路:

  当前有n个苹果,m个盒子。

  (1):假设当前最少的盒子放置一个苹果,则给m个盒子分别放一个苹果,剩下n-m个苹果。

  (2):假设当前最少的盒子不放苹果,则剩m-1个box,n个苹果。

代码:

  

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <iostream>
 5 using namespace std;
 6
 7 int f (int n, int m);
 8
 9 int main ()
10 {
11     int t, n, m;
12     scanf ("%d", &t);
13     while (t --)
14     {
15         scanf ("%d %d", &n, &m);
16         printf ("%d\n", f(n, m));
17     }
18     return 0;
19 }
20
21 int f (int n, int m)
22 {
23     if (n < 0)//没有苹果了,违法
24         return 0;
25     if (n == 0 || m == 1)//一个盒子,无论有几个苹果,就只有一种放置方法,没有苹果一样;
26         return 1;//若有一个苹果就需要讨论累加到哪一个剩余的盒子里,盒子没有顺序,但是盒子里苹果数目不同
27     return f (n-m, m) + f (n, m-1);
28 }
时间: 2024-10-22 01:43:04

poj 1664 放苹果 递归的相关文章

[ACM] POJ 1664 放苹果(n个相同小球放入m个相同盒子)

放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25952   Accepted: 16509 Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t(0 <= t <= 20).以下每行均包含二个整数M和N,以空格分开.1<=M,N<=10. Output 对

poj 1664 放苹果(dfs)

放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30284   Accepted: 19098 Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t(0 <= t <= 20).以下每行均包含二个整数M和N,以空格分开.1<=M,N<=10. Output 对

POJ 1664 放苹果 (递推)

题目链接:http://poj.org/problem?id=1664 dp[i][j]表示i个盘放j个苹果的方案数,dp[i][j] 可以由 dp[i - 1][j] 和 dp[i][j - i] 递推而来. 当盘子的个数大于等于苹果的个数: dp[i - 1][j] :i - 1个盘子放j个苹果,说明i个盘子里最少有一个盘子是空的 dp[i][j - i] :i个盘子都放了苹果,说明有j - i个苹果是随便放置的 否则: dp[i][j] = dp[i - 1][j] 然后没有苹果的盘子的方

POJ 1664 放苹果

传送门:https://i.cnblogs.com/EditPosts.aspx?opt=1 解题思路: m:苹果数量,n:盘子数量. f(m,n):=m个苹果放在n个盘子的方案数 1.n>m 这时总会有有n-m个盘子剩下,这时问题就可以转换到  f(m,m) 2. n<=m 这时有两种情况,每个盘子都放,然后就是把m-n个苹果放入n个盘子  f(m-n,n); 至少有一个盘子不放,那么就是把m个苹果放入n-1个盘子f(m,n-1); 基本情况 只有1个苹果,或0个苹果只有一种情况. 只有一个

POJ 1664 放苹果【DFS】

题意:给出n个苹果,m个盘子,问有多少种不同的苹果放置方法 可以把它抽象为把一个数n,拆分成a1,a2,a3,---,am,使得它们的和为n, 话说这一题是学习的ppt里面的,它的思路就是搜索 搜索条件的设置:放置苹果到第k个盘子的时候,要求第k个盘子里面的苹果数目大于第k-1个盘子里面的苹果数目,如果大于,则把它放置在第k个盘子里,如果不大于,则继续放置苹果,如果剩下的苹果小于k-1个盘子里面的苹果,就停止这个分支的搜索 学搜索学的还是蒙蒙的--- 这一题如果自己模拟一下样例是怎么搜的,好理解

POJ 1644 放苹果 递推 递归

放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28356   Accepted: 17939 Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t(0 <= t <= 20).以下每行均包含二个整数M和N,以空格分开.1<=M,N<=10. Output 对

POJ 1664 把苹果

 把苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25785   Accepted: 16403 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5,1,1和1.5,1 是同一种分法. Input 第一行是測试数据的数目t(0 <= t <= 20).下面每行均包括二个整数M和N,以空格分开.1<=M,N<=10. Out

[poj]1644放苹果

题目链接:http://poj.org/problem?id=1664 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 解题思路: 设f(m,n)为把m个苹果放到n个盘子中的方法数,m>=0,n>=0. 若m和n中任何一个等于0,那么f(m,n) = 1,注意不是等于0,因为相当于就那么一种结果,就是不往盘子里面放(没有苹果),或者,连盘子都没有.若n=1,显然对于任意的m>=0 有f(m,1) =

放苹果——递归

描述: 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法.输入第一行是测试数据的数目t(0 <= t <= 20).以下每行均包含二个整数M和N,以空格分开.1<=M,N<=10.输出对输入的每组数据M和N,用一行输出相应的K. 样例输入 1 7 3 样例输出 8 来源[email protected] 思路:很经典的一枚题目,递归,可以找一下函数之间的规律(很简单的). 递归思路:如果盘子数量大于