动态规划_百炼1664 放苹果

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #include <math.h>
 4 #include <algorithm>
 5 #include <stdlib.h>
 6 #include <vector>
 7 #include <map>
 8 #include <queue>
 9 #include <string>
10 #include <iostream>
11 #include <ctype.h>
12 #include <string.h>
13 #include <set>
14 #include <stack>
15 #include<functional>
16 using namespace std;
17 #define Size 10001
18 #define maxn  1<<30
19 int dp[Size][11];
20 /*表示  i个苹果放在j个盘子里面的所能放的种类
21 dp[i][j]=dp[i][j-1]+dp[i-j][j]
22 i个苹果放在j个盘子里面,
23 只少有一个盘子为空时, dp[i][j-1]
24 没有一个盘子为空时 ,dp[i-j][j],与每个盘子都去掉一个苹果的方法是一样的
25 如果盘子数大于苹果数目那么即为i>j
26 dp[i][j]=dp[j][j]
27
28 找出口的方法!!就是找出最初开始填的元素进行推导
29 首先
30 dp(1,1)=dp(1,0)+dp(0,1)  //dp(1,1) 是我们填表要填的第一个元素 其值为1
31 dp(2,1)=dp(2,0)+dp(1,1)  //其值为1   很明显出口是m==0  和n==0   节上面两个方程可以知道  dp(i,0)=0  dp(0,j)=1;
32 dp(2,2)=dp(2,0)+dp(1,1)
33 */
34 int solve(int n, int m){
35     if (dp[n][m] != -1) return dp[n][m];
36     if (n == 0) {//看出口,一条路是n逐渐减小,  最终可能减到0
37         dp[n][m] = 1;
38         return 1;
39     }
40     if (m == 0) {
41         dp[n][m] = 0;
42         return 0;
43     }
44     if (m > n) {
45         dp[n][m]= solve(n, n);
46         return dp[n][m];
47     }
48
49     dp[n][m]=solve(n - m, m) + solve(n, m - 1);//能走到这肯定是n-m>=1,而出口条件 dp[1][m]因为题目给的条件有水果数目为1的情况,不需要我们定义,其值为1
50     return dp[n][m];
51
52 }
53 int main(){
54
55     int T;
56     cin >> T;
57     while (T--){
58         int n, m;
59         cin >> n >> m;
60         for (int i = 0; i <= n; i++)
61             for (int j = 0; j <= m; j++)
62                 dp[i][j] = -1;
63         cout << solve(n, m) << endl;
64     }
65     system("pause");
66     return 0;
67 }

原文地址:https://www.cnblogs.com/MapReduce/p/8372137.html

时间: 2024-10-08 15:16:30

动态规划_百炼1664 放苹果的相关文章

[ACM] POJ 1664 放苹果(n个相同小球放入m个相同盒子)

放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25952   Accepted: 16509 Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t(0 <= t <= 20).以下每行均包含二个整数M和N,以空格分开.1<=M,N<=10. Output 对

poj 1664 放苹果 递归

题目链接: http://poj.org/problem?id=1664 题目描述: 有n个苹果,m个盒子,盒子和苹果都没有顺序,盒子可以为空,问:有多少种放置方式? 解题思路: 当前有n个苹果,m个盒子. (1):假设当前最少的盒子放置一个苹果,则给m个盒子分别放一个苹果,剩下n-m个苹果. (2):假设当前最少的盒子不放苹果,则剩m-1个box,n个苹果. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <c

poj 1664 放苹果(dfs)

放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30284   Accepted: 19098 Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t(0 <= t <= 20).以下每行均包含二个整数M和N,以空格分开.1<=M,N<=10. Output 对

POJ 1664 放苹果 (递推)

题目链接:http://poj.org/problem?id=1664 dp[i][j]表示i个盘放j个苹果的方案数,dp[i][j] 可以由 dp[i - 1][j] 和 dp[i][j - i] 递推而来. 当盘子的个数大于等于苹果的个数: dp[i - 1][j] :i - 1个盘子放j个苹果,说明i个盘子里最少有一个盘子是空的 dp[i][j - i] :i个盘子都放了苹果,说明有j - i个苹果是随便放置的 否则: dp[i][j] = dp[i - 1][j] 然后没有苹果的盘子的方

POJ 1664 放苹果

传送门:https://i.cnblogs.com/EditPosts.aspx?opt=1 解题思路: m:苹果数量,n:盘子数量. f(m,n):=m个苹果放在n个盘子的方案数 1.n>m 这时总会有有n-m个盘子剩下,这时问题就可以转换到  f(m,m) 2. n<=m 这时有两种情况,每个盘子都放,然后就是把m-n个苹果放入n个盘子  f(m-n,n); 至少有一个盘子不放,那么就是把m个苹果放入n-1个盘子f(m,n-1); 基本情况 只有1个苹果,或0个苹果只有一种情况. 只有一个

POJ 1664 放苹果【DFS】

题意:给出n个苹果,m个盘子,问有多少种不同的苹果放置方法 可以把它抽象为把一个数n,拆分成a1,a2,a3,---,am,使得它们的和为n, 话说这一题是学习的ppt里面的,它的思路就是搜索 搜索条件的设置:放置苹果到第k个盘子的时候,要求第k个盘子里面的苹果数目大于第k-1个盘子里面的苹果数目,如果大于,则把它放置在第k个盘子里,如果不大于,则继续放置苹果,如果剩下的苹果小于k-1个盘子里面的苹果,就停止这个分支的搜索 学搜索学的还是蒙蒙的--- 这一题如果自己模拟一下样例是怎么搜的,好理解

动态规划_百炼4120 硬币

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <math.h> 4 #include <algorithm> 5 #include <stdlib.h> 6 #include <vector> 7 #include <map> 8 #include <queue> 9 #include <string> 10 #include

动态规划_百炼 4121 股票买卖

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <math.h> 4 #include <algorithm> 5 #include <stdlib.h> 6 #include <vector> 7 #include <map> 8 #include <queue> 9 #include <string> 10 #include

动态规划_百炼4122 切割回文

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <math.h> 4 #include <algorithm> 5 #include <stdlib.h> 6 #include <vector> 7 #include <map> 8 #include <queue> 9 #include <string> 10 #include