题意理解
有 NNN 家公司卖干草,第 iii 家的干草包重 PiP_iPi 磅、价格 CiC_iCi 美元,每家货源无限。求购买至少 HHH 磅干草的最小花费。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
思路分析
这是完全背包的变种,关键在于"至少 HHH 磅"而非"恰好 HHH 磅"。
设 dp[j]dp[j]dp[j] 表示:购买至少 jjj 磅干草的最小花费。
状态转移:
对于每家公司 (Pi,Ci)(P_i, C_i)(Pi ,Ci ),考虑买一包:
dp[j]=min(dp[j],dp[max(0,j−Pi)]+Ci)dp[j] = min(dp[j], dp[max(0, j - P_i)] + C_i) dp[j]=min(dp[j],dp[max(0,j−Pi )]+Ci )
当 j−Pi<0j - P_i < 0j−Pi <0 时,从 dp[0]dp[0]dp[0] 转移,表示买的比需要的多(这正是"至少"的含义)。
边界条件:
* dp[0]=0dp[0] = 0dp[0]=0:不需要干草,花费为 0
* dp[j]=∞dp[j] = \inftydp[j]=∞(j>0j > 0j>0):初始无法达到
答案: dp[H]dp[H]dp[H]
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
参考代码