poj1664 放苹果 解题报告
2015-07-28 16:33
183 查看
描述
把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
思路:看了网上大神的思路,屌屌的
设f(m,n) 为m个苹果,n个盘子的放法数目,则对n
当n>m,必定n-m永远空着,就把他们丢了,f(m,n) = f(m,m)
当n<=m时,
1、有至少一个盘子空着,即相当于f(m,n) = f(m,n-1);
2、所有盘子都有苹果,从每个盘子中拿掉一个苹果不改变状态f(m,n) = f(m-n,n)
当没有苹果可放时,设为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
思路:看了网上大神的思路,屌屌的
设f(m,n) 为m个苹果,n个盘子的放法数目,则对n
当n>m,必定n-m永远空着,就把他们丢了,f(m,n) = f(m,m)
当n<=m时,
1、有至少一个盘子空着,即相当于f(m,n) = f(m,n-1);
2、所有盘子都有苹果,从每个盘子中拿掉一个苹果不改变状态f(m,n) = f(m-n,n)
当没有苹果可放时,设为1种放法;
代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; //注意要让m=0返回1,例子,f(2,2)=f(2,1)+f(0,2)=2,如果让f(0,2)其返回0,则错误 int fun(int m,int n) { if(m==0||n==1) return 1; if(n>m) return fun(m,m); else return fun(m,n-1)+fun(m-n,n); } int main() { int T,m,n; scanf("%d",&T); while(T--) { scanf("%d%d",&m,&n); printf("%d\n",fun(m,n)); } }
相关文章推荐
- Maximum Depth of Binary Tree
- Android 自定义View 实现刮刮卡效果
- 黑马程序员——Java基础——IO(一)
- LeetCode算法题2:Add Two Numbers
- 经典算法题每日演练——第十五题 并查集
- 经典算法题每日演练——第十二题 线段树
- 经典算法题每日演练——第十三题 赫夫曼树
- nRF51822使用passkey配对
- a different object with the same identifier value was already 。。 。。 。 。 解决方法
- FusionCharts的属性及其作用
- wait waitpid
- [转]Android逆向之动态调试总结
- [题解]聪明的质检员
- 使用Javascript Ajax 通信操作JSON数据 [上]
- 关于static在java和C++中的用法小谈(一)
- 运行sh提示 unexpected operator
- yourphp二次开发目录
- hdu 5319 Painter (此题纪念不仔细读题而逝去的WA)
- UVa 1635 - Irrelevant Elements(唯一分解)
- 跳过Windows版本的Android Studio安装后首次启动