您的位置:首页 > 其它

(2050): 【NOIP2012普及组】摆花

2016-12-23 13:20 197 查看
时间限制: 1 Sec  内存限制: 128 MB


题目描述

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

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


输入

输入共2行。

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

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


输出

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


样例输入

Copy (如果复制到控制台无换行,可以先粘贴到文本编辑器,再复制)
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。

Oh,how water it is!
简单了,就是看这种花放多少朵~
然后,方程和别的什么东西详见代码。
#include<cstdio>
int n,m,a[105],f[105][105];
int main()
{
int i,j,k;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
f[i][0]=1;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
for(k=0;k<=a[i]&&k<=j;k++)
{
f[i][j]+=f[i-1][j-k];
f[i][j]%=1000007;
}
printf("%d",f
[m]);
}
/**************************************************************
Problem: 2050
User: C20172037dza
Language: C++
Result: 正确
Time:1 ms
Memory:1072 kb
****************************************************************/
好了我讲完了3q。

下周冬季长跑真的好恶心 比dp还恶心= =
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: