題目大意:N 種水果,第 i 種至少買 Aᵢ 個、至多 Bᵢ 個。共購買恰好 M 個水果。求不同購買方案數(水果不可分割,方案以各品種購買數目為準)。N,M ≤ 100,答案 < 10⁹。
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 即為多項式乘法的係數計算過程。
memset(c, 0, sizeof c); c[0]=1; 初始化。j+k<=m 防越界。int 存儲。經典「有上下界的背包計數」/「母函數求係數」。滾動數組 DP 代碼最短、效率最高。關鍵細節:(1) 先對 c[j] 非零判斷剪枝;(2) 內層 k 循環上界取 min(b[i], m-j);(3) 交換指針/數組避免拷貝。同類題目:HDU 1028、POJ 1014 等。