acdream 小晴天老师系列——苹果大丰收(DP)

  小晴天老师系列——苹果大丰收

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解。枚举前面每个盒子可以放多少个,只要保证后面的每一个盒子中的苹果数不大于前面任意一个盒子中的苹果数即可,即让他们有序的排放在前面几个盒子中。

 1 /*
 2 * this code is made by xcw0754
 3 * Problem: 1707
 4 * Verdict: Accepted
 5 * Submission Date: 2015-07-15 14:06:15
 6 * Time: 0MS
 7 * Memory: 1676KB
 8 */
 9 //#pragma comment(linker,"/STACK:102400000,102400000")
10 #include <iostream>
11 #include <stdio.h>
12 #include <string.h>
13 #include <vector>
14 #include <stack>
15 #include <algorithm>
16 #include <map>
17 #include <bits/stdc++.h>
18 #define LL long long
19 #define pii pair<int,int>
20 #define INF 0x7f7f7f7f
21 using namespace std;
22 const int N=12000+50;
23
24 vector<int> vect;
25 int t, nn, mm;
26
27 int DFS(int m, int n, int far)
28 {
29     if( n==1 && far<m)   return 0;
30     if( n==1 && far>=m)  return 1;
31     if( m<=1)  return 1;
32
33     int ans=0;
34     for(int i=1; i<=m; i++)
35     {
36         if(far>=i)
37             ans+=DFS(m-i, n-1, i);
38     }
39     return ans;
40 }
41
42 int main()
43 {
44     //freopen("input.txt", "r", stdin);
45     cin>>t;
46     while(t--)
47     {
48         scanf("%d%d",&mm, &nn);   //m个苹果, n个箱子
49         printf("%d\n",DFS(mm,nn,mm));
50     }
51     return 0;
52 }

AC代码

时间: 2024-10-07 07:36:25

acdream 小晴天老师系列——苹果大丰收(DP)的相关文章

F - 小晴天老师系列——苹果大丰收

F - 小晴天老师系列——苹果大丰收 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Submit Status Problem Description 小晴天的后花园有好多好多的苹果树,某天,苹果大丰收~小晴天总共摘了M个苹果,我们假设苹果之间是不可分辨的. 为了保存苹果,小晴天买了N个一模一样的箱子,想要把苹果放进去,允许有的箱子是空的,请问小晴天有多少种不同的放法呢? 例

[ACDream]小晴天老师系列——竖式乘法

直接上题目: 小晴天老师系列——竖式乘法 Time Limit: 4000/2000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Submit Status Problem Description 小晴天是ACdream团队中最牛的老师之一,他最擅长数学运算~这天他翻开一本<AC is not a dream>杂志,发现最后一页有一道很经典的思维题,题目很简单,每个框填写一个数字,构成一个竖式,每个数的最高位不能为

acdream 小晴天老师系列——竖式乘法(简单穷举)

小晴天老师系列——竖式乘法 Time Limit: 4000/2000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Problem Description 小晴天是ACdream团队中最牛的老师之一,他最擅长数学运算~这天他翻开一本<AC is not a dream>杂志,发现最后一页有一道很经典的思维题,题目很简单,每个框填写一个数字,构成一个竖式,每个数的最高位不能为0,但是有一些数字被隐藏掉了,然后让你根据

acdream 小晴天老师系列——晴天的后花园 (暴力+剪枝)

小晴天老师系列——晴天的后花园 Time Limit: 10000/5000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Problem Description 小晴天非常漂亮的后花园,打算以后退休之后在里面种种花,养养草,所以现在小晴天打算为他的后花园围上栅栏. 小晴天的后花园可以看成是一个m*n的矩形,但是其中有一些地方种了树,这些地方都不能安装栅栏,现在小晴天把后花园的平面图告诉你了,请你帮忙设计一个最大的矩形

【acdream】小晴天老师系列——竖式乘法

C - 小晴天老师系列——竖式乘法 Time Limit: 4000/2000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Submit Status Problem Description 小晴天是ACdream团队中最牛的老师之一,他最擅长数学运算~这天他翻开一本<AC is not a dream>杂志,发现最后一页有一道很经典的思维题,题目很简单,每个框填写一个数字,构成一个竖式,每个数的最高位不能为0,但

D - 小晴天老师系列——晴天的后花园

D - 小晴天老师系列——晴天的后花园 Time Limit: 10000/5000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Submit Status Problem Description 小晴天非常漂亮的后花园,打算以后退休之后在里面种种花,养养草,所以现在小晴天打算为他的后花园围上栅栏. 小晴天的后花园可以看成是一个m*n的矩形,但是其中有一些地方种了树,这些地方都不能安装栅栏,现在小晴天把后花园的平面图

E - 小晴天老师系列——我有一个数列!

E - 小晴天老师系列——我有一个数列! Time Limit: 20000/10000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Submit Status Problem Description 小晴天:“我有一个数列!” 小晴天:“我还要有很多很多的数列!” 于是小晴天就把这个数列的所有连续子数列写出来. 然后小晴天把每个连续子数列中的最大的数写出来. 那么,有多少个比K大呢? Input 多组数据,首先是一

G - 小晴天老师系列——可恶的墨水瓶

G - 小晴天老师系列——可恶的墨水瓶 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) Submit Status Problem Description 小晴天老师正在备课,这时,可恶的墨水瓶突然自己打翻了!悲剧发生了!小晴天的备课稿都被墨水弄脏了.... 不过小晴天很乐观~这时他把他的一张纸分成n*m个格子,其中有一些格子被墨水涂黑了,有的没有.那么小晴天想知道,最大的一块

洛谷OJ 1373 小a和uim之大逃离 DP

https://www.luogu.org/problem/show?pid=1373 题意:n*m地图,n,m<=800,起点,终点任意,两个人每次轮流取出点中的数并膜K,问走奇数次 两人取值相同的方法数? 只关心两人取的值是否相等,则记录差值即可 起点和终点任意 则设状态dp[i][j][k][p] 到达点(i,j)差值为k 并且由p取数的方法数不用枚举起点,暴力把所有状态的方案都计算出来即可,复杂度为O(n*m*k) #include <bits/stdc++.h> using n