openjudge666:放苹果—题解
(测试这里的markdown,同时也有纪念意义吧——第一次写的题解)
当时刚学递推的时候做的一道题
oj上的666题
666:放苹果
总时间限制: 1000ms 内存限制: 65536kB
描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
输入
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出
对输入的每组数据M和N,用一行输出相应的K。
样例输入
1
7 3
样例输出
8
当时学习不精的我看到直到题的时候心中一万匹飞过啊!
好的咱们来认真的说一下这道题
这道题用递推写的话肯定和前几项有关系
什么关系呢?
首先让我们先考虑所有盒子必须装东西的情况
1.所有盒子的其中一个或多个里面只有一个苹果,则苹果数-1,盒子数-1,即dp[i-1][j-1]
2.所有盒子均有超过一个的苹果
然而,因为这道题里面说不可以有重复的方案,所以对于第二个选择,就可以这样想——
将所有的盒子中全部拿出一个来(吃了),盒子数不变
这样做保证了不会有重复的,即dp[i-j][j](因为最开始的dp[i][j]没有重复方案的话,那么dp[i-j][j]也只是将所有的数字全部-1,不改变原来的每个方案的不重复性,那么dp[i][j]方案数量扣除其中盒子含有一个苹果的情况数量,即等于dp[i-j][j],从而让状态不断地递归2,最终到达1,从而保证了方案的合法性)
那么我们讨论了盒子至少放一个的情况,那么就有人问了,为什么说这个,题中不是允许空盒子吗?
所以啊,我们只需要将原先苹果的数量加上盒子数,就能保障上述的成立,即每一个盒子里面至少都有一个苹果,那么我们再每个方案的每一个盒子中拿去一个苹果,不就有可能出现空盒子的方案吗?
但是为什么这样写呢,因为第一种的解题思路与大多数的不重复放苹果问题是一类的(例题有很多,比如说数的划分),从上面的思路也很容易推出允许空盒子的方案数了
上代码
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[1000][1000]={0};//dp[m][n]
int main()
{
int t,m,n;
scanf("%d",&t);
for(int i=1;i<=t;i++){
memset(dp,0,sizeof(dp));
scanf("%d%d",&m,&n);
m+=n;
for(int j=0;j<=m;j++){
dp[j][j]=1;
if(j>0)dp[j][1]=1;
}
for(int j=1;j<=m;j++){
for(int k=1;k<=n&&k<=j;k++){
dp[j][k]=dp[j-1][k-1]+dp[j-k][k];
}
}
printf("%d\n",dp[m][n]);
}
return 0;
}
openjudge666:放苹果—题解的更多相关文章
- poj 1664 放苹果 (划分数)
题意:中文题目,不解释... 题解: 第一种方法是暴力深搜:枚举盘子1~n放苹果数量的所有情况,不需要剪枝:将每次枚举的情况,即每个盘的苹果数量,以字典序排序,然后存进set里 以此去重像" ...
- 放苹果 POJ - 1664 递推
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t(0 <= t < ...
- OpenJudge 666:放苹果 // 瞎基本DP
666:放苹果 总时间限制: 1000ms 内存限制: 65536kB 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1 ...
- oj放苹果
题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输入 每个用例包含二个整数M和N.0<=m< ...
- POJ 1664 放苹果
放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24985 Accepted: 15908 Description ...
- POJ --- 1164 放苹果
放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24947 Accepted: 15887 Description ...
- POJ——放苹果
4:放苹果 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示) ...
- poj1664放苹果(递归)
题目链接:http://poj.org/problem?id=1664 放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: ...
- 放苹果(poj1664递归)
ti放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24392 Accepted: 15513 Descripti ...
随机推荐
- VIN码识别,车架号识别,OCR扫描工具
近年二手车交易市场火爆,对二手车估值需要了详细解二手车的历史状况,车架号(VIN码)是车辆唯一的身份标识,也是了解二手车车况的入口,车商和二手车平台会频繁的进行车况查询,VIN码扫描识别技术给车辆估值 ...
- Uncaught Error: code length overflow. (1604>1056)
解决方法来源~~~https://blog.csdn.net/arrowzz/article/details/80656510 二维码生成时,如果长度太长会有异常: Uncaught Error: c ...
- [JSON].typeOf( keyPath )
语法:[JSON].typeOf( keyPath ) 返回:[String | Number | Boolean | Json | Array | Function | 空字符] 说明:获取指定键 ...
- JavaScript 的一些基础知识
JavaScript基本语法 调试 打开 Chrome 开发工具 Win F12 Mac Command + Option + I 输入代码.测试执行 var str = 'evenyao' cons ...
- 本周PSP图
本周共写博文5篇,共计4800字,知识点:知道了博客应当如何写,接触了博客园,阅读了构建之法 内容 开始时间 结束时间 中断时间 共计时间 9月8日博文 22:00 22:55 10min聊天 45m ...
- 《梦断代码Dreaming In Code》阅读笔记(二)
这段时间一口气读了5章,所以想着现在一块写阅读笔记. 在阅读的这段时间,我一直是晚上进行阅读,很多时候都是读完一看已经一个小时了,效果还不错.闲话不表,说说阅读心得. 关于底层语言或是低级语言,我之前 ...
- TCP系列26—重传—16、重组包
一.介绍 在TCP重传的时候,并没有限制TCP只能重传与初传完全相同的报文段大小,TCP允许执行重组包(repacketization),发送一个更大的TCP报文段,进而增加性能.TCP在重传时候允许 ...
- TCP系列13—重传—3、协议中RTO计算和RTO定时器维护
从上一篇示例中我们可以看到在TCP中有一个重要的过程就是决定何时进行超时重传,也就是RTO的计算更新.由于网络状况可能会受到路由变化.网络负载等因素的影响,因此RTO也必须跟随网络状况动态更新.如果T ...
- 【week6】psp
本周psp
- 异常--throw
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...