洛谷 P1077 擺花 題解
阿新 • • 發佈:2017-08-19
getchar() 空格 main ac代碼 col getch 一個 輸入 art
輸出格式:
此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。
題目鏈接:https://www.luogu.org/problem/show?pid=1077
題目描述
小明的花店新開張,為了吸引顧客,他想在花店的門口擺上一排花,共m盆。通過調查顧客的喜好,小明列出了顧客最喜歡的n種花,從1到n標號。為了在門口展出更多種花,規定第i種花不能超過ai盆,擺花時同一種花放在一起,且不同種類的花需按標號的從小到大的順序依次擺列。
試編程計算,一共有多少種不同的擺花方案。
輸入輸出格式
輸入格式:第一行包含兩個正整數n和m,中間用一個空格隔開。
第二行有n個整數,每兩個整數之間用一個空格隔開,依次表示a1、a2、……an。
輸出只有一行,一個整數,表示有多少種方案。註意:因為方案數可能很多,請輸出方案數對1000007取模的結果。
輸入輸出樣例
輸入樣例#1:2 4 3 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。
NOIP 2012 普及組 第三題
分析:
這一道題需要關註的是當前擺花的數量和方案數。
f[i]表示擺i盆花的方案數。
狀態轉移方程為f[i] = f[i-1]+f[i-2]...+f[i-num[j]];
記得取模。
AC代碼:
1 #include<algorithm> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 6 long long f[10005]; 7 int num[105]; 8 const int MOD = 1000007; 9 10 inline void read(int &x) 11{ 12 char ch = getchar(),c = ch;x = 0; 13 while(ch < ‘0‘ || ch > ‘9‘) c = ch,ch = getchar(); 14 while(ch <= ‘9‘ && ch >= ‘0‘) x = (x<<1)+(x<<3)+ch-‘0‘,ch = getchar(); 15 if(c == ‘-‘) x = -x; 16 } 17 18 int main() 19 { 20 int n,m; 21 read(n),read(m); 22 for(int i = 1;i <= n;++ i) 23 read(num[i]); 24 f[0] = 1; 25 for(int i = 1;i <= n;++ i) 26 for(int j = m;j >= 0;-- j) 27 for(int k = 1;j >= k&&k <= num[i];k ++) 28 f[j] = (f[j]+f[j-k])%MOD; 29 printf("%d",f[m]); 30 return 0; 31 }
洛谷 P1077 擺花 題解