[NOIP2012] 擺花
阿新 • • 發佈:2017-05-06
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] 擺花