擺花 (DP動態規劃)

2021-08-29 02:08:59 字數 1663 閱讀 8702

時間限制: 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()

#includeusing

namespace

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...