acdream 小晴天老师系列——苹果大丰收(DP)
2015-07-16 13:06
316 查看
小晴天老师系列——苹果大丰收
Problem Description
小晴天的后花园有好多好多的苹果树,某天,苹果大丰收~小晴天总共摘了M个苹果,我们假设苹果之间是不可分辨的。为了保存苹果,小晴天买了N个一模一样的箱子,想要把苹果放进去,允许有的箱子是空的,请问小晴天有多少种不同的放法呢?
例如对于4个苹果,3个箱子,2+1+1和1+2+1和1+1+2 是同一种分法。
Input
多组数据,首先是一个正整数t(t<=100)表示数据的组数。每组数据均包含二个整数M和N(1<=M,N<=10)。
Output
对于每组数据,输出一个整数,表示不同的放法数。Sample Input
1 7 3
Sample Output
8
Hint
对于7个苹果,3个箱子有7+0+0=6+1+0=5+2+0=4+3+0=5+1+1=4+2+1=3+2+2=3+3+1
这8种放法。
思路:DP解。枚举前面每个盒子可以放多少个,只要保证后面的每一个盒子中的苹果数不大于前面任意一个盒子中的苹果数即可,即让他们有序的排放在前面几个盒子中。
/* * this code is made by xcw0754 * Problem: 1707 * Verdict: Accepted * Submission Date: 2015-07-15 14:06:15 * Time: 0MS * Memory: 1676KB */ //#pragma comment(linker,"/STACK:102400000,102400000") #include <iostream> #include <stdio.h> #include <string.h> #include <vector> #include <stack> #include <algorithm> #include <map> #include <bits/stdc++.h> #define LL long long #define pii pair<int,int> #define INF 0x7f7f7f7f using namespace std; const int N=12000+50; vector<int> vect; int t, nn, mm; int DFS(int m, int n, int far) { if( n==1 && far<m) return 0; if( n==1 && far>=m) return 1; if( m<=1) return 1; int ans=0; for(int i=1; i<=m; i++) { if(far>=i) ans+=DFS(m-i, n-1, i); } return ans; } int main() { //freopen("input.txt", "r", stdin); cin>>t; while(t--) { scanf("%d%d",&mm, &nn); //m个苹果, n个箱子 printf("%d\n",DFS(mm,nn,mm)); } return 0; }
AC代码
相关文章推荐
- Algorithms—106.Construct Binary Tree from Inorder and Postorder Traversal
- javascript不可能全会的30道题
- pthread_attr_setstacksize(
- Foundation框架介绍
- hdu 1247 Hat’s Words(字典树)
- (C#)使用队列(Queue)解决简单的并发问题
- linux中设置TAB键的宽度
- 菜鸟开通博客,第一站,目标是充满未知与挑战的下一站
- C# 经典排序算法大全
- js 如何获取浏览器的高度?
- 常使用命令
- tableView计算动态行高的总结
- Find a way(bfs)
- 15.Java5的CyclicBarrier同步工具
- dirname(__FILE__) 的使用总结
- android Activity初次的启动的时候播放声音
- linux线程
- POJ_FlipGame
- 目标,方法,选择,努力
- 设置快速访问google的dns