POJ 1164 放苹果 经典的组合问题
来源:互联网 发布:mysql 缓存命中率 编辑:程序博客网 时间:2024/04/29 17:52
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
1
7 3
Sample Output
8
思路:
假设dp[m][n]表示把m个苹果放在n个盘子里的方法,
如果 n > m,则至少有n-m个盘子为空,这n-m个盘子对结果没有影响, 所以有dp[m][n]=dp[m][n-m].
如果 n <= m, 则dp[m][n]由两部分组成
1 如果至少有一个为空,则dp[m][n] = d[m][n-1];
2 如果每个盘子都有苹果,假设从每个盘子里拿走一个苹果,则问题变为m-n个苹果放在n个盘子里的子问题,dp[m][n] = dp[m-n][n];
总的放苹果数等于两种之和:dp[m][n]= dp[m][n-1] + dp[m-n][n]
1 递归法
递归出口说明:
如果n ==1,只有一个盘子,则结果为1
如果m == 0, 规定值为1
代码如下:
#include<iostream>#include<stdio.h>#include<algorithm>#include<memory.h>using namespace std;int fun(int m,int n){ if(m == 0 || n == 1) return 1; if(n > m) return fun(m,m); return fun(m,n-1) + fun(m-n,n);}int main(){ //freopen("input.txt","r",stdin); int t,m,n; cin>>t; while(t--) { cin>>m>>n; cout<<fun(m,n)<<endl; } return 0;}
2 递推法
#include<iostream>#include<stdio.h>#include<algorithm>#include<memory.h>using namespace std;const int N = 11;int dp[N][N];//dp[i][j]表示i个盘子j个苹果void getList(){ for(int i = 0; i < N; i++) { dp[0][i] = (i==0); } for(int i = 1; i < N; i++) { for(int j = 0; j < N; j++) { dp[i][j] = dp[i-1][j]; if(j >= i) dp[i][j] += dp[i][j-i]; } }}int main(){ // freopen("input.txt","r",stdin); getList(); int t,m,n; cin>>t; while(t--) { cin>>m>>n; cout<<dp[n][m]<<endl; } return 0;}
阅读全文
0 0
- POJ 1164 放苹果 经典的组合问题
- 经典递归问题--放苹果POJ【1664】
- POJ1664 放苹果【组合问题】
- 组合数学 - 放苹果问题
- POJ 1164 放苹果
- poj 1164 放苹果
- POJ 1664 放苹果 (基础组合dp)
- POJ 1664 放苹果(经典递推)
- 【HPUoj】放苹果问题(组合数学)
- 放苹果(组合+DFS)
- POJ 1664放苹果(递归问题)
- 经典递归 苹果的放法
- POJ-1664 放苹果(递归的运用)
- poj 1664 放苹果
- poj 1664 放苹果
- poj 放苹果 1664
- POJ 1664 放苹果
- POJ 1664 放苹果
- C++ 用libcurl库进行http通讯网络编程
- vim插件之bufexplorer
- CentOS6.8下NTP服务的搭建与配置
- android资源相关
- 微信公众号支付总结
- POJ 1164 放苹果 经典的组合问题
- java:常见笔试题以及答案汇总
- 预处理/内联函数和宏定义
- stm32定时器TIM2的PWM输出PB3
- 安卓模拟器中外置sdcard的位置
- Unity3D 游戏开发之内存优化
- Android程序员学WEB前端(10)-JavaScript(1)-基础-Sublime
- Linux主要目录,和常用命令
- 编写优质嵌入式C程序