题目链接

题目

题目描述

小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共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. spring--JDK动态代理和CGLIB代理的区别

    JDK 动态代理和 CGLIB 代理是 Java 中常用的两种动态代理实现方式,它们各有特点和适用场景: JDK 动态代理: JDK 动态代理是基于接口的代理方式,它使用 Java 反射机制来创建代理 ...

  2. Nacos源码 (4) 配置中心

    本文阅读nacos-2.0.2的config源码,编写示例,分析推送配置.监听配置的原理. 客户端 创建NacosConfigService对象 Properties properties = new ...

  3. 极简版 haproxy的搭建步骤

    背景 发现四层nginx的代理报错. 然后想着换用一下haproxy的配置. 早些时候 看过tidb的一些最佳时间, 这里简单整理一下. 下载 https://src.fedoraproject.or ...

  4. [转帖]Percolator 和 TiDB 事务算法

    https://cn.pingcap.com/blog/percolator-and-txn 本文先概括的讲一下 Google Percolator 的大致流程.Percolator 是 Google ...

  5. [转帖]无需 zookeeper 安装 kafka 集群 (kakfa3.0 版本)

    https://xie.infoq.cn/article/7769ef4576a165f7bdf142aa3 一.kafka 集群实例角色规划 在 kafka3.0 中已经可以将 zookeeper ...

  6. 【转帖】Java Full GC (Ergonomics) 的排查

    文章目录 1. Full GC (Ergonomics) 1.1 Java 进程一直进行 Full GC 1.2 Full GC 的原因 1.3 检查堆占用 2. 代码检查 3. 解决方式 1. Fu ...

  7. 【转帖】高性能异步io机制:io_uring

    文章目录 1.性能测试 1.1.FIO 1.2.rust_echo_benc 2.io_uring 2.1.io_uring_setup 2.2.io_uring_enter 2.3.io_uring ...

  8. PHP GC回收机制详解

    前言 GC的全称是Garbage Collection也就是垃圾回收的意思,在PHP中,是使用引用计数和回收周期来自动管理内存对象的,当一个对象被设置为NULL,或者没有任何指针指向时,他就会变成垃圾 ...

  9. vue中$once的使用

    $once 可以给组件实例绑定一个自定义事件,但该事件只能被触发一次,触发之后随即被移除 $once的简单使用 <template> <div> <button @cli ...

  10. web端用户的输入都应该做如下限制

    web端中,所有可以输入的地方.都应该做如下操作. 1=>不能够输入script关键字,如果用户输入了.进行提示.然后删除用户输入的值 (这样比较粗暴,不太友好) 2=>用户输入了含有sc ...