dp训练第14题 vijos1159. 岳麓山上打水 完全背包,满包,输出方案

背包体积为v(20000),n(100)种物品,每种体积为Ci.
要求装满背包且所用物品种数最小,种数相同时,选择按Ci排序后字典序最小的一种方案.

很难的一道题,写了又写删了又删,好好整理一下思路.
首先类似一个完全背包,每种物品可以取无限个.
其次是一个满包,要求物品总体积恰好等于背包体积.
然后,价值是按种算的,而且要求种数最小.
最后,有一个关于字典序的要求,需要设定比较方案.

想一下性质:
首先预处理,将100种物品按体积从小到大排序,然后遍历.如果某个大数是某个小数的倍数,那么扔掉这个大数.如果背包体积是某个物品体积的倍数,直接输出.这样
其次,物品总数只有100个,观察发现具有最优子结构:大包的最优情况,除去包里的全部某种物品后,剩下的小包一定是小包的最优情况.
但是要注意,对只去掉某件而不是该种的全部时,这个性质是不成立的.
举例子:物品15 17 21 23,背包大小55.最优解应该是 17*2+21
如果去掉一个17剩下38时,最优解不是17+21而是15+23.
这就要求,对于每个物品,必须一个状态立即转移所有可到达的状态.
再然后,如果同一个背包有着两种物品数一样组成不一样的解法,应该设定一种比较方案.如果使用bitset保存的话,每次转移复杂度是log100.如果每个状态都记录两个数:体积最小的物品,体积最小的物品一共所占的空间.比较时,首先比较物品种类,选择少的,其次比较体积最小的物品,选择小的,再次比较分别减去两个最小体积空间后的最小体积物品.直到比出结果.

复杂度为O(NV(V/Ci)),很容易超时,尝试写一下

等一下…….不管怎么写都有问题
查了一下题解,发现这是一道迭代加深搜索+dp题.
…..
先略过,最后一部分学dp与其他结合时,再回来做.
(我不会说我实在看不懂题解)
……
似乎有纯dp做出来的?
还是我太蠢了?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值