洛谷 P1077 摆花 题解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1077 摆花 题解相关的知识,希望对你有一定的参考价值。

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

题目链接:https://www.luogu.org/problem/show?pid=1077

题目描述

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

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

输入输出格式

输入格式:

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

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

输出格式:

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

输入输出样例

输入样例#1:
2 4
3 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。

NOIP 2012 普及组 第三题

 

分析:

这一道题需要关注的是当前摆花的数量和方案数。

f[i]表示摆i盆花的方案数。

状态转移方程为f[i] = f[i-1]+f[i-2]...+f[i-num[j]];

记得取模。

 

AC代码:

 1 #include<algorithm>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 
 6 long long f[10005];
 7 int num[105];
 8 const int MOD = 1000007;
 9 
10 inline void read(int &x)
11 {
12     char ch = getchar(),c = ch;x = 0;
13     while(ch < 0 || ch > 9) c = ch,ch = getchar();
14     while(ch <= 9 && ch >= 0) x = (x<<1)+(x<<3)+ch-0,ch = getchar();
15     if(c == -) x = -x;
16 }
17 
18 int main()
19 {
20     int n,m;
21     read(n),read(m);
22     for(int i = 1;i <= n;++ i)
23         read(num[i]);
24     f[0] = 1;
25     for(int i = 1;i <= n;++ i)
26         for(int j = m;j >= 0;-- j)
27             for(int k = 1;j >= k&&k <= num[i];k ++)
28                 f[j] = (f[j]+f[j-k])%MOD;
29     printf("%d",f[m]);
30     return 0;
31 }

 

以上是关于洛谷 P1077 摆花 题解的主要内容,如果未能解决你的问题,请参考以下文章

动态规划 洛谷P1077 摆花

洛谷P1077 摆花(背包dp)

洛谷P1077 摆花

洛谷 P1077 摆花

洛谷P1077[摆花]

洛谷 P1077摆花 01背包dp