(测试这里的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:放苹果—题解的更多相关文章

  1. poj 1664 放苹果 (划分数)

    题意:中文题目,不解释... 题解: 第一种方法是暴力深搜:枚举盘子1~n放苹果数量的所有情况,不需要剪枝:将每次枚举的情况,即每个盘的苹果数量,以字典序排序,然后存进set里 以此去重像" ...

  2. 放苹果 POJ - 1664 递推

    把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t(0 <= t < ...

  3. OpenJudge 666:放苹果 // 瞎基本DP

    666:放苹果 总时间限制:  1000ms     内存限制:  65536kB 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1 ...

  4. oj放苹果

    题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输入 每个用例包含二个整数M和N.0<=m< ...

  5. POJ 1664 放苹果

    放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24985   Accepted: 15908 Description ...

  6. POJ --- 1164 放苹果

    放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24947   Accepted: 15887 Description ...

  7. POJ——放苹果

    4:放苹果 查看 提交 统计 提问 总时间限制:  1000ms  内存限制:  65536kB 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示) ...

  8. poj1664放苹果(递归)

    题目链接:http://poj.org/problem?id=1664 放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: ...

  9. 放苹果(poj1664递归)

    ti放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24392   Accepted: 15513 Descripti ...

随机推荐

  1. nginx 路由配置

    nginx中location对url匹配: 语法:location [=|~|~*|^~] /uri/ { … } 当匹配中符合条件的location,则执行内部指令:如果使用正则表达式,必须使用~* ...

  2. “地表最贵iPhone”到货,iPhone XS 系列手机等你来测!

    WeTest 导读 9月13日,苹果正式发布了全新的 iPhone XS 系列智能手机,备受瞩目的iPhone家族新成员具体又是怎样的呢?   关于iPhone XS系列手机的那些新亮点   大屏.双 ...

  3. Python 集合内置函数大全(非常全!)

    Python集合内置函数操作大全 集合(s).方法名 等价符号 方法说明 s.issubset(t) s <= t 子集测试(允许不严格意义上的子集):s 中所有的元素都是 t 的成员   s ...

  4. [JSON].result()

    语法:[JSON].result() 返回:[True | False] 说明:用json字符串创建JSON实例时,如果该json字符串不是合法的json格式,会创建一个空的json实例.但是我们如果 ...

  5. python 终极篇 ---- 中间件

    中间件------------------------>>>>>>>>>>>>> 中间件是一个用来处理django的响应与 ...

  6. 使用Docker部署java web项目

    在国内可能会有源下载失败问题,docker安装失败, 这里提供docker离线安装包如有需要可以进行下载 docker离线安装包下载 ##本文环境使用centos 7 进行部署. #1安装docker ...

  7. ARM架构中的程序执行与调用

    ARM架构中的程序执行与调用 1. 几个名词 ABI : 可执行文件必须遵守的规范,以在特定执行环境中运行: 单独产生的可重定址的文件必须遵守的规范,以用来链接和执行. EABI: 适用于嵌入式环境的 ...

  8. fragment的介绍与使用

    稍稍摘录一段Fragment.java中的说明文档. /** * A Fragment is a piece of an application's user interface or behavio ...

  9. 《Linux编程大作业》

    一.要求 作业题目 Linux下的多进程/线程网络通信 作业目标 要求学生熟练掌握<Linux编程>课程中的知识点,包括Linux常用命令.bash脚本.编译和调试环境.读写文件.进程间通 ...

  10. 深搜(DFS)与广搜(BFS)区别

    最近做了不少的搜索题,时而用到DFS时而用到BFS,这里对两种搜索方法做一个总结. 广度优先搜索算法(Breadth-First-Search,缩写为 BFS),是一种利用队列实现的搜索算法.简单来说 ...