1 条题解
-
0
The Fewest Coins G:题解
思路
设 John 付款总额为 ,则店主找零 。分别定义:
pay[y]:John 用有限硬币凑出金额 的最少枚数;change[x]:店主用无限硬币凑出金额 的最少枚数。
答案为所有可行的
pay[T+x]+change[x]的最小值。令最大面值为 。只需枚举 。在最少找零方案中,非 面值硬币少于 枚;否则考察前缀和模 ,可找出总值为 倍数的非空子集,并用更少的面值 硬币替换。当 时,找零至少包含 枚最大面值硬币。付款总值也至少为 ,任取 枚付款硬币,同样能找出总值为 、 的非空子集;同时取消这些付款硬币和找零中的 枚最大面值硬币,净付款不变而转手硬币数减少,矛盾。因此至少存在一个最优方案满足该上界。
做法
change使用完全背包。pay是多重背包:处理面值 、数量 时,按模 的余数分组。对金额 有next[r+qv] = q + min(old[r+pv]-p),其中 。括号内是固定宽度滑动窗口最小值,可用单调队列维护。每种硬币对应的每个金额只进出队一次。
复杂度
时间复杂度为 ,空间复杂度为 。金额上界不超过 。
子任务 1 可枚举 John 对每种硬币的使用数量;子任务 2 可在多重背包中直接枚举当前硬币使用 枚;满分使用上述单调队列优化。
- 1
信息
- ID
- 962
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者