題目描述
小明的花店新開張,為了吸引顧客,他想在花店的門口擺上一排花,共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盆,擺花時同一種花放在一起,且不同種類的花需按標號的從小到大的順序依次擺列。試程式設計計算,一共有多少種不同的擺花方案。...