题目链接

题目

题目描述

小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m 盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n 种花,从1 到n 标号。为了在门口展出更多种花,规定第i 种花不能超过ai 盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。

试编程计算,一共有多少种不同的摆花方案。

输入描述

第一行包含两个正整数n和m,中间用一个空格隔开。

第二行有n个整数,每两个整数之间用一个空格隔开,依次表示a1、a2、……an。

输出描述

输出只有一行,一个整数,表示有多少种方案。注意:因为方案数可能很多,请输出方案数对1000007取模的结果。

示例1

输入

2 4
3 2

输出

2

说明

有2种摆花的方案,分别是(1,1,1,2),(1,1,2,2)。括号里的1和2表示两种花,比如第一个方案是前三个位置摆第一种花,第四个位置摆第二种花。

备注

对于20%数据,有0<n≤8,0<m≤8,0≤ai≤8;

对于50%数据,有0<n≤20,0<m≤20,0≤ai≤20;

对于100%数据,有0<n≤100,0<m≤100,0≤ ai≤100。

题解

知识点:背包dp,计数dp。

可以看作一个多重背包,每种花是看作物品,花的盆数是物品数量。于是有转移方程:

\[dp[i][j] = sum[j] - sum[j-a[i]-1],sum[n] = \sum_{j=1}^{n} dp[i-1][j]
\]

表示考虑到第 \(i\) 盆花已经摆了 \(j\) 盆时的方案数是考虑到 \(i-1\) 盆摆了 \([j-a[i],j]\) 盆的方案数的总和,可以用前缀和优化,普通的多重背包就不一定可以这样优化qwq。

可以滚动数组优化空间。

题外话

一个经典模型 \(x_1 + x_2 + \cdots + x_m = n,x_i \geq 1 \and x_i \in \Z^+\) ,每个整数位置和值不同就是方案不同,问有多少种方案。

考虑把整数当成多个不加区分的 \(1\) 合在一起的结果,用不加区分的隔板分隔不同的整数。例如:111|11|1111|1|1,就分出了 \([3,2,4,1,1]\) 。

于是对于这个模型,有 \(m-1\) 个隔板,\(n\) 个 \(1\) ,一共会有 \(n+m-1\) 个位置放 \(1\) 和隔板,先放隔板有 \(C_{n+m-1}^{m-1}\) 种方案,剩下的放 \(1\) 有 \(C_n^n\) 种方案,共计 \(C_{n+m-1}^{m-1} = C_{n+m-1}^{n}\) 种方案。

注意 \(x_i \geq 1\) 是必须的,如果 $x_i \geq a_i $ 则可以通过 \(x_i - a_i+1\) 的变形使得符合条件。

但本题是 \(1 \leq x_i \leq a_i\) ,就不能用这个经典模型了。

其实经典模型是个完全背包,而本题则是多重背包。

时间复杂度 \(O(nm)\)

空间复杂度 \(O(m)\)

代码

#include <bits/stdc++.h>

using namespace std;

const int mod = 1000007;
int a[107], dp[107], sum[107];///第i种花,一共摆了j个 int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m;
cin >> n >> m;
dp[0] = 1;
for (int i = 1;i <= n;i++) cin >> a[i];
for (int i = 1;i <= n;i++) {
sum[0] = dp[0];
for (int j = 1;j <= m;j++) sum[j] = (sum[j - 1] + dp[j]) % mod;
for (int j = 0;j <= m;j++)
dp[j] = (sum[j] - (j - a[i] - 1 < 0 ? 0 : sum[j - a[i] - 1]) + mod) % mod;
}
cout << dp[m] << '\n';
return 0;
}

NC16576 [NOIP2012]摆花的更多相关文章

  1. [NOIP2012] 摆花

    1270. [NOIP2012] 摆花 http://cogs.pro/cogs/problem/problem.php?pid=1270 ★   输入文件:flower.in   输出文件:flow ...

  2. NOIP2012摆花

    题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m 盆.通过调查顾客的喜好,小明列出了顾客最喜欢的 n 种花,从 1 到 n 标号.为了在门口展出更多种花,规定第 i 种花不 ...

  3. [noip科普]关于LIS和一类可以用树状数组优化的DP

    预备知识 DP(Dynamic Programming):一种以无后效性的状态转移为基础的算法,我们可以将其不严谨地先理解为递推.例如斐波那契数列的递推求法可以不严谨地认为是DP.当然DP的状态也可以 ...

  4. 【转】关于LIS和一类可以用树状数组优化的DP 预备知识

    原文链接 http://www.cnblogs.com/liu-runda/p/6193690.html 预备知识 DP(Dynamic Programming):一种以无后效性的状态转移为基础的算法 ...

  5. NOIP2012 普及组 T3 摆花——S.B.S.

    题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...

  6. [Noip2012普及组]摆花

    Description 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m 盆.通过调查顾客的喜好,小明列出了顾客最喜欢的 n 种花,从 1 到 n 标号.为了在门口展出更多种花,规定 ...

  7. 洛谷P1077 [NOIP2012普及组]摆花 [2017年四月计划 动态规划14]

    P1077 摆花 题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能 ...

  8. Vijos_1792_摆花_(动态规划,多重集组合数)

    描述 https://vijos.org/p/1792 共n种花,第i种花有a[i]个,要摆m个,同一种花连续且花按照序号从小到大排,问共有多少种摆花方案.   描述 小明的花店新开张,为了吸引顾客, ...

  9. NOIP2012 普及组真题 4.13校模拟

    考试状态: 我今天抽签看了洛谷的… 这我能怂???凶中带吉,我怕考试??我!不!怕! 看着整个机房的男同学们,我明白我是不会触发我的忌了.很好,开刷. A. [NOIP2012普及组真题] 质因数分解 ...

  10. CH Round #30 摆花[矩阵乘法]

    摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看 ...

随机推荐

  1. /etc/profile,/etc/bashrc,~/.profile,~/.bashrc 的区别及使用

    转载请注明出处: /etc/profile  为系统的全局环境变量设置,此文件为系统的每个用户设置环境信息    /etc/bashrc 为每一个运行bash shell的用户执行此文件.当bash ...

  2. JMS微服务开发示例(三)使用分布式锁和编写定时任务

    分布式锁 在Controller当中,提供了分布式锁的功能,代码如下: class HelloworldController : MicroServiceControllerBase { static ...

  3. [转帖]003、体系结构之TiKV持久化

    TiKV架构和作用 数据持久化 分布式一致性 MVCC 分布式事务 Coprocessor coprocessor : 协同处理器. 可以将一些SQL计算交给TiKV处理.不需要将TiKV所有数据通过 ...

  4. [转帖]Sosreport:收集系统日志和诊断信息的工具

    https://zhuanlan.zhihu.com/p/39259107 如果你是 RHEL 管理员,你可能肯定听说过 Sosreport :一个可扩展.可移植的支持数据收集工具.它是一个从类 Un ...

  5. [转帖]用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具

    https://www.zhihu.com/people/javajia-gou-ji-zhu-44/posts   JDK命令行工具 在JDK的开发包中,除了大家熟知的java.exe和javac. ...

  6. OpenEuler切换内核的方法-bcc学习后续

    OpenEuler切换内核的方法 摘要 昨天使用OpenEuler 22.03 LTS学习bcc但是一直不行. 没办法切换到CentOS8 还有 Anolis 8 很容易就可以直接还是用了 yum i ...

  7. 境内下载nodejs二进制文件

    下载 nodejs 安装包的方法 找到一个境内的淘宝源 可以直接使用 下载速度还比较快 但是没有 龙芯的.. http://npm.taobao.org/mirrors/node/v10.20.0/

  8. ESXi 虚拟机性能情况简单验证

    1.虚拟化的CPU超售问题. 经过查找资料, 发现 ESXi 5.5 的版本 一个 物理CPU的Core 可以虚拟出 25个vCPU, 升级到ESXi6.0 之后可以虚拟化32个vCPU. 所以虚拟化 ...

  9. 使用rpm打包nacos然后部署为systemd服务开机自动启动的方法

    背景 Nacos是阿里开源的服务注册组件,能够简单的实现微服务的注册与发现机制. 但是官方并没有提供 sytemd的服务脚本, 也没有提供rpm包的方式. 公司里面使用 nacos的场景越来越多, 部 ...

  10. Windows 审计日志 安全部分不刷新的解决办法

    现在存在一个问题如图示: 有接近15个小时的日志没有进行记录和展示. 要追查问题比较麻烦. 后来发现必须要手动刷新一下 审计记录才可以实现. 感觉比较奇怪 位置为  计算机配置->windows ...