多重揹包 P1077 擺花

2021-10-04 08:05:03 字數 1352 閱讀 9318

題目描述

小明的花店新開張,為了吸引顧客,他想在花店的門口擺上一排花,共mm盆。通過調查顧客的喜好,小明列出了顧客最喜歡的nn種花,從11到nn標號。為了在門口展出更多種花,規定第ii種花不能超過a_iai​盆,擺花時同一種花放在一起,且不同種類的花需按標號的從小到大的順序依次擺列。

試程式設計計算,一共有多少種不同的擺花方案。

輸入格式

第一行包含兩個正整數nn和mm,中間用乙個空格隔開。

第二行有nn個整數,每兩個整數之間用乙個空格隔開,依次表示a_1,a_2,…,a_na1​,a2​,…,an​。

輸出格式

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

輸入輸出樣例

輸入 #1複製

2 4

3 2

輸出 #1複製

2
說明/提示

【資料範圍】

對於20%資料,有0對於50%資料,有0對於100%資料,有0解題思路 :多重揹包問題求恰好裝滿的方案總數(多重揹包計數問題)

可以把這道題看做 二維dp,定義 f[i,j]:前i 種花瓶,拜訪成 j個的 方案數

狀態轉移方程 f[i,j] = sum(f[i-1,j-i])   sum是求和,  1<=i<= cnt[i]   

改進:使用 滾動陣列+從後往前 遍歷  優化 空間複雜度

f[j] = sum(f[j-i])   1<=i<= cnt[i]   

初始化 f[0] =1  乙個不擺,也是一種方案!

#include#define maxn 120

using namespace std;

int nums[maxn];

int dp[maxn];

const int mod =1000007;

int main();

int nums[6];

int dp[maxn];

int main()

int ans = 0;

dp[0] = 1;

for(int i=0;i<6;i++)

for(int j=1;j<=nums[i];j++)

for(int k=sum;k>=j*w[i];k--)

if(dp[k-j*w[i]]) dp[k] = 1;

for(int i=1;i<=sum;i++)

if(dp[i])

ans++;

cout<<"total="

}

P1077 擺花 揹包DP

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

洛谷P1077 擺花 揹包dp

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

擺花 洛谷p1077

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