题意理解
有 nnn 种邮票,每种面值为 aia_iai ,每种数量无限。最多贴 kkk 张邮票,求最大的 mmm,使得 111 到 mmm 的所有面值都能凑出。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
思路分析
这是完全背包的变种。
设 dp[j]dp[j]dp[j] 表示凑出面值 jjj 需要的最少邮票数。如果 dp[j]≤kdp[j] \leq kdp[j]≤k,则面值 jjj 可达。
状态转移(完全背包):
dp[j]=min(dp[j], dp[j−ai]+1)dp[j] = \min(dp[j], \, dp[j - a_i] + 1) dp[j]=min(dp[j],dp[j−ai ]+1)
边界条件:
* dp[0]=0dp[0] = 0dp[0]=0:凑出面值 0 不需要邮票
* 其他初始化为无穷大
答案: 找最大的连续 mmm,使得 dp[1],dp[2],⋯ ,dp[m]dp[1], dp[2], \cdots, dp[m]dp[1],dp[2],⋯,dp[m] 都 ≤k\leq k≤k
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
参考代码