時間限制: 1 sec 記憶體限制: 128 mb
提交: 17 解決: 10 [
提交][
狀態][
討論版][命題人:外部匯入]
3.擺花
(flower.cpp/c/pas)
【問題描述】
小明的花店新開張,為了吸引顧客,他想在花店的門口擺上一排花,共 m 盆。通過調
查顧客的喜好,小明列出了顧客最喜歡的 n 種花,從 1 到 n 標號。為了在門口展出更多種花,
規定第 i 種花不能超過 ai盆,擺花時同一種花放在一起,且不同種類的花需按標號的從小到大的順序依次擺列。
試程式設計計算,一共有多少種不同的擺花方案。
【輸入】
輸入檔案 flower.in,共 2 行。
第一行包含兩個正整數 n 和 m,中間用乙個空格隔開。
第二行有 n 個整數,每兩個整數之間用乙個空格隔開,依次表示 a1、a2、……an。
【輸出】
輸出檔名為 flower.out。
輸出只有一行,乙個整數,表示有多少種方案。注意:因為方案數可能很多,請輸出
方案數對 1000007 取模的結果。
【輸入輸出樣例 1】
flower.in
2 43 2
flower.out
2【輸入輸出樣例說明】
有 2 種擺花的方案,分別是(1,1,1,2), (1,1,2,2)。括號裡的 1 和 2 表示兩種花,
比如第乙個方案是前三個位置擺第一種花,第四個位置擺第二種花。
【資料範圍】
對於 20%資料,有 0對於 50%資料,有 0對於 100%資料,有 0
解析:f[n][m] 取到第i種花時,還有m盆要取。 f[n][m] = f[n][m] + f[n-1][m-k] 0<=k <= a[i]
m == 0, 說明取完,返回結果 為 1.
m != 0 && i == 0 則說明沒有取完,因此該方案結果數為0.
先想到的就是暴搜。。。。但是程式一編出來測一下100 100 100頓時就呵呵呵,所以果斷的換方法,對於題目,用一種抽象思維去理解它,把n種花看作n種物品,m盆看做總費用不超過m,
每種物品可取a[i]件,是不是有點像多重揹包?
那麼再想想,這道題100的資料如果用動態規劃的三重迴圈貌似剛好夠?那麼就這個了,
只是f[n][m]所表示的含義應為前n件物品擺m盆的方案數,前兩重迴圈不變,
只是最後的迴圈應該改為累加,累加前n-1件物品擺1盆,2盆,3盆。。。的方案數,最後答案即為f[n][m]
初始化就是f[0][0]=1;
#includeint n,m,a[105],f[105][105];
void
dp()
intmain()
#includeusingnamespace
std;
int num[101
];
intn,m;
int f[101][101
];
int dfs(int i,int m) //
當前擺到第i種,還剩m盆要擺。
intmain()
P1077 擺花 dp 搜尋)
傳送門 思路 dpdp dp的經典題,若沒有思路先嘗試爆搜,會t tt掉,然後記憶化一下就可以acac ac,當然能用記憶化搜尋,肯定也能dpdp dp了,最後根據別的大佬的推出來是01 0101 揹包。tql tqltq l 搜尋 include using namespace std typed...
擺花 dp,揹包,各種優化
題目描述 小明的花店新開張,為了吸引顧客,他想在花店的門口擺上一排花,共m盆。通過調查顧客的喜好,小明列出了顧客最喜歡的n種花,從1到n標號。為了在門口展出更多種花,規定第i種花不能超過ai 盆,擺花時同一種花放在一起,且不同種類的花需按標號的從小到大的順序依次擺列。試程式設計計算,一共有多少種不同...
noip2012普及組 擺花 DP
題意 有n種花,每種花有ai盆。現在求從左到右擺出m盆,要求id小的在id大的前面的方法數目。f i j 為用了前i種花,從左到右擺了j盆的方法數。f i j f i 1 j f i j 1 f i 1 j ai 1 f i 1 j ai 1 轉移到 f i j 需要擺ai 1盆花,所以需要減去 i...