背景
NOIP2012
描述
小明的花店新開張,爲了吸引顧客,他想在花店的門口擺上一排花,共m盆。通過調查顧客的喜好,小明列出了顧客最喜歡的n種花,從1到n標號。爲了在門口展出更多種花,規定第i種花不能超過ai盆,擺花時同一種花放在一起,且不同種類的花需按標號的從小到大的順序依次擺列。試編程計算,一共有多少種不同的擺花方案。
格式
輸入格式
【輸入】
輸入文件共2行。第一行包含兩個正整數n和m,中間用一個空格隔開。第二行有n個整數,每兩個整數之間用一個空格隔開,依次表示a1、a2、……an。
輸出格式
【輸出】
輸出只有一行,一個整數,表示有多少種方案。注意:因爲方案數可能很多,請輸出方案數對1000007取模的結果。
限制
1S
提示
【輸入輸出樣例說明】
有2種擺花的方案,分別是(1,1,1,2),(1,1,2,2)。括號裏的1和2表示兩種花,比如第一個方案是前三個位置擺第一種花,第四個位置擺第二種花。
來源
NOIP2012普及組第三題
思路
代碼
#include <iostream>
#define MOD 1000007
#define N 105
using namespace std;
int n,m,a[N],f[N]={1};
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) //n種花
{
cin>>a[i]; //輸入第i種花的盆數
for(int j=m;j>=0;j--) //放j盆花,01揹包,第i種花可以取1盆、2盆……a[i]盆,也可以不取,所以要倒序
for(int k=1;k<=min(j,a[i]);k++) //第i種花能夠取的分數
f[j]=(f[j]+f[j-k])%MOD; //求方案數,只要將狀態轉移方程的max變成sum即可,每一次都要取模
}
cout<<f[m]<<endl;
return 0;
}