poj 1663 放苹果
2016-09-08 10:28
218 查看
题意: 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1是同一种分法。
Input
第一行是测试数据的数目t(0<=t<=20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
Output
对输入的每组数据M和N,用一行输出相应的K。
Sample Input
1
7 3
Sample Output
8
思路: 想法其实很简单,直接fn(m,n)递归求解。m表示苹果树,n表示盘子数。主要分为两种情况。
1、m<n 的情况, fn(m,n)=fn(m,m) ,很好理解m个苹果最多能放m个盘子,又因为盘子都一样。
2、m>=n, fn(m,n)=fn(m−n,n)+fn(m,n−1) ,这个式子表示,先把每个盘子里放一个苹果在放其他的也就是fn(m−n,n),留一个空盘子不放也就是fn(m,n−1) 。
最后结束递归的条件是fn(m,n) if(m==0||n==1||m==1) 时返回1。
AC代码:
Input
第一行是测试数据的数目t(0<=t<=20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
Output
对输入的每组数据M和N,用一行输出相应的K。
Sample Input
1
7 3
Sample Output
8
思路: 想法其实很简单,直接fn(m,n)递归求解。m表示苹果树,n表示盘子数。主要分为两种情况。
1、m<n 的情况, fn(m,n)=fn(m,m) ,很好理解m个苹果最多能放m个盘子,又因为盘子都一样。
2、m>=n, fn(m,n)=fn(m−n,n)+fn(m,n−1) ,这个式子表示,先把每个盘子里放一个苹果在放其他的也就是fn(m−n,n),留一个空盘子不放也就是fn(m,n−1) 。
最后结束递归的条件是fn(m,n) if(m==0||n==1||m==1) 时返回1。
AC代码:
#include <iostream> #include <stdio.h> #include <cmath> #include <cstring> #include <algorithm> #include <map> using namespace std; #define ll long long #define eps 1e-8 const ll maxn = 100005; const ll mod = 1e9+7; ll fn(ll m,ll n)///int型的也可以 { if(m==0||n==1||m==1) return 1; if(n>m) return fn(m,m); else return fn(m,n-1)+fn(m-n,n); } int main() { int T; ll m,n; scanf("%d",&T); while(T--) { scanf("%I64d%I64d",&m,&n); printf("%I64d\n",fn(m,n)); } return 0; }
相关文章推荐
- C#递归算法之分而治之策略
- 有关数据库SQL递归查询在不同数据库中的实现方法
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- C#递归方法实现无限级分类显示效果实例
- 使用SqlServer CTE递归查询处理树、图和层次结构
- C#递归算法之打靶算法分析
- C#中的尾递归与Continuation详解
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- php递归创建目录的方法
- PHP递归创建多级目录
- Javascript递归打印Document层次关系实例分析
- C#递归算法寻找数组中第K大的数
- C++使用递归方法求n阶勒让德多项式完整实例
- C#用递归算法解决经典背包问题
- oracle 使用递归的性能提示测试对比
- 使用curl递归下载软件脚本分享
- Perl脚本实现递归遍历目录下的文件
- JavaScript的递归之递归与循环示例介绍
- C# 递归查找树状目录实现方法