1. 程式人生 > >[Noip2012普及組]擺花

[Noip2012普及組]擺花

Description

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

Input

共 2 行。
第一行包含兩個正整數 n 和 m,中間用一個空格隔開。
第二行有 n 個整數,每兩個整數之間用一個空格隔開,依次表示 a1、a2、……an。

Output

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

Sample Input

2 4
3 2

Sample Output

2
普及組難度一般的dp,詳情見程式碼

方程的含義是到第i種花,一共擺了j盆,第i種花擺k盆的方案總數

#include<cstdio>
int f[101][101],n,m,a[101];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    f[0][0]=1;
    for(int i=1;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]);
}