本文共 2766 字,大约阅读时间需要 9 分钟。
链接:
题目大意:
有N件家具,每件的重量为(1 ≤ wi ≤ 100), 用两辆车把他们来运送到目的地。这两辆车的限载重量分别为C1, C2(1 ≤ Ci ≤ 100) , 问最少几趟可以把所有家具运送到目的地。
这两辆车每趟都必须一起走,即使某辆车没载东西。
思路:
(一)
先上自己的方法:
枚举第一辆车可能载的家具的所有组合情况,那么用二进制来表示状态则共有 1<<n ,如果二进制的第i位上是1,那么就表示第i件家具是由第一辆车运的。
这样就相当于把所有家具分成了两组,一组给第一辆车运,另一组给第二辆车运。
然后分别对这两组数据计算,分别最少几次可以运完,这样,问题就转换为了:给n个家具,和一辆限载重量c的车,这辆车最少几次可以运完。
由贪心的思想可以知道,每次运送应该尽可能的装满这辆车,那么用01背包,背包容量为限载重量c,每个家具的重量即是价值也是耗费, f[c]就是这次运送的。选择完一次后,把那些选择过的家具删除掉,继续再做01背包选择,直到所有家具全部选择完。至于记录选择了哪些家具,方法和记录路径一样。
然后,这两辆车分别运送次数取较大的,就是这个枚举到的这个方案的最少次数。
(二)
这个方法是学习的,网上的基本都是这个方法,不再细讲。
大概思路是,用二进制表示选择状态,先预处理所有选择的组合,看这个组选择的家具能否被两辆车子一次运过去,如果可以的话就“打包”起来看作是一个物体,然后再对所有物体进行01背包。
代码:
方法一:
#include #include #include #include #include #include
方法二:
#include #include #include #include #include #include
转载地址:http://hpzni.baihongyu.com/