POJ 1164 放苹果 经典的组合问题
2017-09-05 17:05
393 查看
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]
表示把m个苹果放在n个盘子里的方法,
如果 n > m,则至少有n-m个盘子为空,这n-m个盘子对结果没有影响, 所以有dp[m]
=dp[m][n-m].
如果 n <= m, 则dp[m]
由两部分组成
1 如果至少有一个为空,则dp[m]
= d[m][n-1];
2 如果每个盘子都有苹果,假设从每个盘子里拿走一个苹果,则问题变为m-n个苹果放在n个盘子里的子问题,dp[m]
= dp[m-n]
;
总的放苹果数等于两种之和:dp[m]
= dp[m][n-1] + dp[m-n]
1 递归法
递归出口说明:
如果n ==1,只有一个盘子,则结果为1
如果m == 0, 规定值为1
代码如下:
2 递推法
把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]
表示把m个苹果放在n个盘子里的方法,
如果 n > m,则至少有n-m个盘子为空,这n-m个盘子对结果没有影响, 所以有dp[m]
=dp[m][n-m].
如果 n <= m, 则dp[m]
由两部分组成
1 如果至少有一个为空,则dp[m]
= d[m][n-1];
2 如果每个盘子都有苹果,假设从每个盘子里拿走一个苹果,则问题变为m-n个苹果放在n个盘子里的子问题,dp[m]
= dp[m-n]
;
总的放苹果数等于两种之和:dp[m]
= dp[m][n-1] + dp[m-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 ;//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 [m]<<endl; } return 0; }
相关文章推荐
- 经典递归问题--放苹果POJ【1664】
- 经典背包问题 POJ 3624
- HDU - 1003 - Max Sum && POJ - 1050 - To the Max (经典DP问题)
- NYOJ289 苹果(经典的01背包问题)
- [经典] 组合指定和问题
- poj 棋盘问题(经典DFS)(枚举)
- POJ 1664 放苹果 (基础组合dp)
- POJ_3984经典迷宫问题
- 几个经典递归问题(放苹果,红与黑,八皇后,木棍)
- 组合数学经典问题---铺砖问题
- 输出1到N之间所有相加等于M的数字组合(背包问题)求相加为M的所有组合--微软酷派经典面试题
- LeetCode Letter Combinations of a Phone Number 经典组合问题
- 【转】POJ 1159 Palindrome【经典的DP回文问题】
- 【HPUoj】放苹果问题(组合数学)
- 经典问题五.【乘号两边有正负 区间dp】Polygon poj 1179
- POJ 迷宫问题(经典BFS问题)
- POJ1077(经典的八数码问题)
- java排列组合问题汇总【经典】
- POJ 1321 - 棋盘问题 ( 经典DFS )
- POJ 2245 Lotto(组合问题)