1. 程式人生 > >[NOIP2012] 擺花

[NOIP2012] 擺花

blank ace ron 括號 格式 esp default 整數 依次

1270. [NOIP2012] 擺花

http://cogs.pro/cogs/problem/problem.php?pid=1270

★ 輸入文件:flower.in 輸出文件:flower.out 簡單對比
時間限制:1 s 內存限制:128 MB

【題目描述】

小明的花店新開張,為了吸引顧客,他想在花店的門口擺上一排花,共m盆。通過調查顧客的喜好,小明列出了顧客最喜歡的n種花,從1到n標號。為了在門口展出更多種花,規定第i 種花不能超過ai 盆,擺花時同一種花放在一起,且不同種類的花需按標號的從小到大的順序依次擺列。

試編程計算,一共有多少種不同的擺花方案。

【輸入格式】

輸入文件flower.in,共2行。

第一行包含兩個正整數n和m,中間用一個空格隔開。

第二行有n個整數,每兩個整數之間用一個空格隔開,依次表示a1、a2、……an。

【輸出格式】

輸出文件名為flower.out。

輸出只有一行,一個整數,表示有多少種方案。註意:因為方案數可能很多,請輸出方案數對1000007取模的結果。

【輸入輸出樣例】

flower.in flower.out
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。

用f[i][j]表示前i種花一共種了m盆的方案數,則f[i][j]=sum{f[i-1][j-k]} (0<=k<=a[i])

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,a[110
],f[110][110]; int main(){ freopen("flower.in","r",stdin); freopen("flower.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=0;i<=a[1];i++)f[1][i]=1; for(int i=2;i<=n;i++) for(int j=0;j<=m;j++) for(int k=0;k<=a[i];k++) if(j>=k)f[i][j]=(f[i][j]+f[i-1][j-k])%1000007; printf("%d",f[n][m]); }

[NOIP2012] 擺花