AlvinZH双掉坑里了

AlvinZH双掉坑里了

时间限制: 1000 ms 内存限制: 65536 kb

题目描述

AlvinZH双掉进坑里了!

幸运的是,这坑竟然是宝藏迷宫的入口。这一次AlvinZH机智地带了很多很多背包——装金币!

假设现在AlvinZH捡到了n块金币,他一共带了m个背包,每个背包可以装任意多金币,但AlvinZH不允许有空的背包。

请你帮他计算一下一共有多少种装金币的方法吧!

注意:所有背包看作相同,即{1,3}和{3,1}是同一种方法。

输入

输入包含多组数据。

每组数据包含两个正整数,为金币数n(1≤n≤10^4),背包数m(1≤m≤10^3,且m≤n)。

输出

对于每组数据,输出一行,为使用所有背包装金币的方法数(结果对1000007取模)。

输入样例

4 2
9 3

输出样例

2
7

样例解释

4:{1,3}{2,2};

9:{1,1,7}{1,2,6}{1,3,5}{1,4,4}{2,2,5}{2,3,4}{3,3,3}。

HINT

这不是简单的背包问题,请勿套公式。

AlvinZH:其实和背包没有任何关系~

思路

简单DP。简化问题:将n个金币放入m个盒子,无空盒。

直接上dp吧,dp[i][j]:将i个金币放入j个盒子的方法数。此题的关键在于如何找到状态转移方程,很有可能会计算重复的方法。我们把答案分成两部分:

①放完之后所有盒子金币数量大于1;
②放完之后至少有一个盒子金币数量为1。
这样分可以保证不会有重复计算。状态转移方程: dp[i][j]=dp[i?j][j]+dp[i?1][j?1]。

① dp[i?j][j] :将(i-j)个金币放到j个盒子,然后这j个盒子每个再放1个金币。表示的是将i个金币分成所有盒子金币数量大于1的方案总数。例如,求9分解成3份,6(9-3)分成3份可以分为{1,1,4}{1,2,3}{2,2,2},则9可以分为{2,2,5}{2,3,4}{3,3,3},共3种。

② dp[i?1][j?1]:将(i-1)个金币放到(j-1)个盒子,再来一个盒子放1个。表示的是将i个金币分成至少有一个盒子金币数量为1的方案总数。例如,求9分解成3份,8(9-1)分成2份可以分为{1,7}{2,6}{3,5}{4,4},则9可以分为{1,1,7}{1,2,6}{1,3,5}{1,4,4},共4种。

难点在于如何避免重复,这里处理得十分巧妙,请细细体会。

以上转自https://www.cnblogs.com/AlvinZH/p/7840604.html#_label3

之所以将答案分为1,2两种情况,是由于1,2两种情况可以把原问题分为两个不相交的集合,且每个子集的答案都可以以一种方式从规模更小的问题中生成。

放完后所有盒子金币数大于1:假设”将i个金币放入j个盒子且所有盒子金币数大于1“的放法有k种,那么我从每个盒子拿去一个金币,一定对应子问题dp[i-j][j]的一种放法,即两者的放法数是相等的。

每个dp[i-j][j]的一种放法,各加一个金币都可以生成现有问题的一个放法;而现有问题的放法各拿去一个金币又可以生成子问题dp[i-j][j]的一种放法,二者一一对应。

放完后至少有一个盒子金币数量为1:假设”将i个金币放入j个盒子且至少有一个盒子金币数量为1“的放法有k种,那我拿去这个盒子和这个球,一定对应子问题dp[i-1][j-1]的一种放法,即二者放法数是相等的。

另外关于初始值,将某个非法子问题的dp值置0来使得其贡献为0

i>=j才能保证没有空包,只对i>=j问题求解,否则保持初始值0,表示该情况不能生成更规模问题的解(贡献为0)。

另外i,j>=1的才是问题讨论的范围,因此循环i,j从1开始,且将dp[i][0],dp[0][j]也置0

但注意dp[0][0]要初始化为1(但感觉上应该是初始化do[1][1]=1,只不过初始化dp[0][0]=1碰巧能通过转移方程求出dp[1][1]=1且这样能保持循环的美观,也可以直接初始化dp[1][1]但此时循环中i=1,j=1的情况就要跳过,否则又会被重新写为0)

参考代码

 1 //
 2 // Created by AlvinZH on 2017/10/23.
 3 // Copyright (c) AlvinZH. All rights reserved.
 4 //
 5
 6 #include <cstdio>
 7 #include <cstring>
 8 #define MOD 1000007
 9
10 int n, m;
11 int dp[10005][1005];
12
13 int main()
14 {
15     while(~scanf("%d %d", &n, &m))
16     {
17         memset(dp, 0, sizeof(dp));
18         dp[0][0] = 1;
19         for (int i = 1; i <= n; ++i) {
20             for (int j = 1; j <= m; ++j) {
21                 if(i - j >= 0)
22                     dp[i][j] = (dp[i-j][j] + dp[i-1][j-1]) % MOD;
23             }
24         }
25
26         printf("%d\n", dp[n][m]);
27     }
28 }

原文地址:https://www.cnblogs.com/loganlzj/p/10134287.html

时间: 2024-07-31 17:44:06

AlvinZH双掉坑里了的相关文章

为啥我老掉坑里

在一个群里看到,码代码除了主线外,还是一个和各种toollist抗争的过程. 和一个同学聊到,工资只是零花钱,一定要习得赚取生活费的技能. 被一个同学问到,两个方向或者两个问题的冲突,除了资源互斥,还有时间线上的不可逆转冲突. 这几天跟中了邪似的,每次我想做正事的时候,例如修改程序,看游戏代码,总是会被意料之外的事情给打断,这种正事无法启动的情况十分打击我的积极性... 例如刚打开vs,发现昨天手误点到的更新导致今天出错,之后又修复vs,修复vs的时候,发现源文件已删除:不小心修改了平台工具集,

掉坑里了,小心

今天公司产品一个功能突然挂掉了...向客户演示之前出现了,手机端显示不能获取下载资源,可是急坏了一票人.. 通过手机端,调查服务器地址调用了http:/2342342.domain.hostname.cn/apis/stickydataurls/接口,服务器返回502和500错误,去查看服务器前端Nginx错误日志显示: 2014/08/13 16:11:00 [error] 23851#0: *10303771 connect() failed (111: Connection refused

修Bug(中途掉坑里,差点失控,后期完美补刀)

刚接手的项目留下一些bug,是一个word文档,一个一个慢慢解决吧: 先从简单的入手吧,找找感觉: bug:导出的word文档有乱码(<=b>.<=:p>): 生成word文档的方式是有3个模板文件,生成的时候动态替换标题和内容等: 3个文件放在类路径的某个目录下: 没有做缓存,每次都实时IO读取文件,这里可以优化: 问题可能是3个文件的编码,手动改下试试: 改成代码里边写的GBK: 重试,没效果: 修改文件,真的是多了字符,好多低级错误: ok,解决了,这个bug花了40分钟:

AlvinZH掉坑系列讲解

本文由AlvinZH所写,欢迎学习引用,如有错误或更优化方法,欢迎讨论,联系方式QQ:1329284394. 前言 动态规划(Dynamic Programming),是一个神奇的东西.DP只能意会,不可言传.大家在做DP题的时候一定要理清思路,一般是先不管空间,毕竟以空间换时间,大多数题都是先卡时间再卡空间的. DP具备的两个要素:最优子结构和子问题重叠,见<算法导论>225页.简单来讲就是问题是一个由多决策产生最优值的最优化问题. 最优化原理:其子问题的最优会导致全局最优,具有最优子结构的

为什么绝大部分人都掉进了坑里

原创: 二号头目 九边 4月4日 经济,地理,金融视野下仰望大历史的天空作者:二号头目 有个词,跟“熵增”一样令人着迷,叫内卷化. 第一次听到这个词是在一篇分析清朝经济的文章中,讨论清朝为啥以魔鬼的步伐避开了工业革命的时候,学者们提出了“内卷”的概念. 这是个啥意思呢?这么个逻辑链: 首先,清朝人口太多,人力成本非常非常的低: 所以,不管干啥,都不需要改进技术,通过增加人力就可以解决.比如丝绸和瓷器有利可图,需要扩大再生产,如果在英国,人力太贵,增加一百个人的花费还不如搞台机器来解决,英国人开始

Docker 从入门到掉坑

简单的对docker进行介绍,可以把它理解为一个应用程序执行的容器.但是docker本身和虚拟机还是有较为明显的出入的.我大致归纳了一下,可以总结为以下几点: docker自身也有着很多的优点,关于它的优点,可以总结为以下几项: 安装docker 从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE. Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用. 首先我们需要移除旧的docker版本:

iPhone5S掉水盆里了不开机了维修多少钱iPhone5S掉水里开不开机了维修多少钱

为什么网上的价格差距这么大?为什么打电话问的商家报的价格都不一样?哪种几百块钱的屏幕(芯片)能相信吗?淘宝上面的屏幕(芯片)能相信吗?哪里能找到原装的屏幕呢?哪里的维修点才靠谱呢?北京中关村和深圳那边的维修市场能相信吗? 电子城报的二三百能相信吗?原装的配件和仿的价钱相差多少呢? 当您看到了这里,请您选择飞维智能科技有限责任公司(我们用最真挚的态度来为您服务) 我们在保证质量的前提下用最低的价格来为广大客户服务.我们的原则是(少花钱,买放心,保质量,求口碑) 工程师:罗飞报修热线:158 110

iPhone5S掉水盆里怎么办掉水里开不开机捞起放米里面管用吗维修主板多少钱

为什么网上的价格差距这么大?为什么打电话问的商家报的价格都不一样?哪种几百块钱的屏幕(芯片)能相信吗?淘宝上面的屏幕(芯片)能相信吗?哪里能找到原装的屏幕呢?哪里的维修点才靠谱呢?北京中关村和深圳那边的维修市场能相信吗? 电子城报的二三百能相信吗?原装的配件和仿的价钱相差多少呢? 当您看到了这里,请您选择飞维智能科技有限责任公司(我们用最真挚的态度来为您服务) 我们在保证质量的前提下用最低的价格来为广大客户服务.我们的原则是(少花钱,买放心,保质量,求口碑) 工程师:罗飞报修热线:158 110

苹果iPhone5手机掉水里了黑屏了不能开机了哪里可以维修更换主板多少钱

为什么网上的价格差距这么大?为什么打电话问的商家报的价格都不一样?哪种几百块钱的屏幕(芯片)能相信吗?淘宝上面的屏幕(芯片)能相信吗?哪里能找到原装的屏幕呢?哪里的维修点才靠谱呢?北京中关村和深圳那边的维修市场能相信吗? 电子城报的二三百能相信吗?原装的配件和仿的价钱相差多少呢? 当您看到了这里,请您选择飞维智能科技有限责任公司(我们用最真挚的态度来为您服务) 我们在保证质量的前提下用最低的价格来为广大客户服务.我们的原则是(少花钱,买放心,保质量,求口碑) 工程师:罗飞报修热线:158 110