poj——1664——放苹果
2014-01-20 15:18
197 查看
Description
把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
Sample Output
分析:
本题目可使用递归方法求解。向n个盘子里放m个苹果,可以分两种情况:
①至少空出一个盘子不放(相对于目前),则转化为在(n-1)个盘子里放m个苹果,在剩下的盘子里放入0个苹果,即apple(m,n-1);
②所有盘子至少放入一个。先在每个盘子里都放入1个苹果,剩下m-n个苹果,再在n个盘子里进行放置。即apple(m-n,n)。
注意,上面两种情况均不考虑已经放入的苹果。
再考虑递归终止条件。
当m==0时,苹果已经放完,只有一种情况,即不放置,返回1;
当n==1时,只有一个盘子可以放置,返回1;
当m时,苹果数小于盘子数,和将m个苹果放入m个盘子情况相同。
把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
分析:
本题目可使用递归方法求解。向n个盘子里放m个苹果,可以分两种情况:
①至少空出一个盘子不放(相对于目前),则转化为在(n-1)个盘子里放m个苹果,在剩下的盘子里放入0个苹果,即apple(m,n-1);
②所有盘子至少放入一个。先在每个盘子里都放入1个苹果,剩下m-n个苹果,再在n个盘子里进行放置。即apple(m-n,n)。
注意,上面两种情况均不考虑已经放入的苹果。
再考虑递归终止条件。
当m==0时,苹果已经放完,只有一种情况,即不放置,返回1;
当n==1时,只有一个盘子可以放置,返回1;
当m时,苹果数小于盘子数,和将m个苹果放入m个盘子情况相同。
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int dp(int m,int n) { if(m==0) return 1; else if(n==1) return 1; else if(m<n) return dp(m,m); return dp(m,n-1)+dp(m-n,n); } int main() { int n,m; int t; while(cin>>t) { for(int k=1;k<=t;k++) { cin>>m>>n; cout<<dp(m,n)<<endl; } } return 0; }
相关文章推荐
- Java内存泄漏
- 如何在IOS开发中在自己的framework中添加.bunble文件
- 解析Ceph: Snapshot
- Winform禁止容器内控件获得焦点时改变容器显示范围坐标
- poj1659(贪心构造图)
- Spring MVC表单提交中文数据出现乱码
- GeoServer的特点
- System.Web.HttpUtility.UrlEncode编码转换
- php利用新浪接口查询ip获取地理位置示例
- 主机安装ISAPI_Rewrite配置
- jquery控制页面滚动条
- How to get Json in Android
- 传统电视急解互联网焦虑 跨界出击手游电商
- 用VS2010创建数据库工程的经验
- ubuntu \ Fedora 下修改chrome root方式启动
- 教你解决Win8的IE10浏览器不兼容的问题
- mutex 和 spinlock 对比
- android apk 获取system权限
- [itint5]跳马问题加强版
- 关于mybatis 模糊查询