问题描述
运营一家卖卡车的公司,现已知未来n个月每月的销量用di表示。每月月初可以选择下单进货一定数量的卡车,或当月卖掉或放在仓库中囤积起来。一次下单费用为K,且无论订单中卡车数量多少。仓库的最大容量为S,其中每辆卡车每月存储在仓库中花费C。怎样使得总花销最少。
首先明确一下花销的来源:
- 仓库的存储费用C,每辆每月
- 下订单的费用K,每次(不管一次买了多少卡车都是K)
问题分析(参考答案)
现在已知每月的销量di,不如分析一下di辆卡车的来源;
- 当月下的订单当月卖出
- 以前放在仓库中囤积的,到了第i月才卖出
- 仓库中囤积的+当月下的订单
它们对应的花销分别为:
- K
- C×di× 月份,这里暂时未知
- C×di×月份+K
一目了然,由于题目特殊设置,第三种情况肯定比第一种情况花的钱多。也就是说,若是当月的库存量小于需求量,此时我不得不另外下单来满足当月需求的时候,肯定不会把仓库里的库存拿出来充需求,因为只要下单了,无论数目多少花费都是K。由此不难想到,要使总花销最少,这种情况下库存量应为0才好。
这时卡车的来源变为两类:
- 当月下的订单当月卖出
- 以前放在仓库中囤积的,到了第i月才卖出
那么与之对应的是库存量与需求量的两种情况:
- 库存量<需求量,当月下订单
- 库存量>需求量,从库存中提取需求
不妨以T[i,s]作为当月花销,其中i表示第i月,s表示此时仓库的库存量。下面针对这两种情况做出分析:
第一种情况s<di
这种情况需要当月下订单,问题又来了,购入多少呢?至少di-s辆(这种情况讨论过了,其实并不合算),合算的话也就是多于di辆,剩余的可以存起来留到以后再售出。
以a作为多出di部分的卡车数量:
T[i,s]=K+min{a*C+T[i+1,a]} (0≤a≤S)
第二种情况s≥di
T[i,s]=(s-di)*C+T[i+1,s-di]
得到递推公式。
总结
每次碰到这类问题还是容易理不清思路想复杂,遇到问题多想是好事,也能考虑到各种各样的情况。但是在动态规划问题中,其实只要考虑问题的子结构,找出能解决问题最优的那一个就行。