P1077 [NOIP 2012 普及组] 摆花
P1077 [NOIP 2012 普及组] 摆花 - 洛谷
这道题是 “多重背包 + 有顺序限制” 的经典变形,下面我们一步步详细讲解题意、解法思路和你的代码逻辑。
✅【题意解析】
你要用 n 种花,总共摆放 m 盆。
状态转移方程
对于第 i 种花,我们最多可以用 a[i]
盆。
枚举摆的总数 j
从 m 到 0,再枚举这第 i 种花使用的数量 k
(从 1 到 min(j, a[i])):
for (int i = 1; i = 0; j--) // 枚举总盆数(必须倒着) for (int k = 1; k <= min(a[i], j); k++) // 枚举当前花使用数量 f[j] = (f[j] + f[j - k]) % mod;
为什么 j
要倒着枚举?
-
避免第 i 次更新时,把当前 i 次生成的
f[j-k]
再次用来更新,导致重复计算。