首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

HDU 2152 Fruit:母函數 / DP 計算水果拼盤方案數

     編輯:C++ 入門

HDU 2152 Fruit:母函數 / DP 計算水果拼盤方案數

題目大意:N 種水果,第 i 種至少買 Aᵢ 個、至多 Bᵢ 個。共購買恰好 M 個水果。求不同購買方案數(水果不可分割,方案以各品種購買數目為準)。N,M ≤ 100,答案 < 10⁹。

DP 狀態與轉移

dp[i][j] = 前 i 種水果購買 j 個的方案數。
轉移:dp[i][j] = Σ dp[i-1][j-k],k ∈ [Aᵢ, Bᵢ] 且 j-k ≥ 0。
初始:dp[0][0] = 1。
答案:dp[N][M]。

滾動數組優化

用兩個一維數組 c[](當前)、s[](暫存)交替:


for (i=0; i

空間 O(M),時間 O(N × M × 平均區間長) ≤ 100³ = 10⁶,極快。

母函數視角

第 i 種水果生成函數 Gᵢ(x) = x^{Aᵢ} + x^{Aᵢ+1} + ... + x^{Bᵢ}。
總生成函數 G(x) = Π Gᵢ(x)。
答案為 G(x) 中 x^M 的係數。DP 即為多項式乘法的係數計算過程。

代碼關鍵點(C++)

  • memset(c, 0, sizeof c); c[0]=1; 初始化。
  • 三層循環:水果 → 已買數量 → 本品種買數量。
  • 邊界 j+k<=m 防越界。
  • 無需取模,答案 < 10⁹ 直接 int 存儲。

總結

經典「有上下界的背包計數」/「母函數求係數」。滾動數組 DP 代碼最短、效率最高。關鍵細節:(1) 先對 c[j] 非零判斷剪枝;(2) 內層 k 循環上界取 min(b[i], m-j);(3) 交換指針/數組避免拷貝。同類題目:HDU 1028、POJ 1014 等。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved