2019.01.27算法题:HDU - 1059

HDU - 1059 Dividing

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1059

代码地址:https://paste.ubuntu.com/p/TcgSxTzqBh/

质量为i的东西有a[i]个,分两拨问能不能质量相等,质量和为奇显然不能,偶数时只要达到sum/2的背包就行了,剩下的自然组成了另外sum/2的背包。。这个还是多重背包好点吧,01背包有超时,用二进制优化一下。

某个大佬的想法:所谓多重背包就是01背包的升级版,每件物品有限定的件数,因此可以遍历每件物品的数目当01背包来做,但数据量大的时候必然超时,于是可以进行二进制优化,即将一定数目的物品集合拆分成若干份,每份的代价分别为2^0*原代价,2^1*原代价,2^2*原代价...2^n*原代价,价值亦然,比如某价值为10,重量为3的物品有7件,将这7件物品拆成重量分别为3(1*3),6(2*3),12(4*3),价值分别为10,20,40的三件物品,就可以优化时间了,这3,6,12重量的物品可以组成7件及以内的任意组合的重量, 所以不用担心漏掉组合的情况。

再如重量为1的物品有14件,拆成重量为1,2,4,7即可,虽然有重复,但也比原来优化了不少。

原文:https://blog.csdn.net/junior19/article/details/54563134

你可能感兴趣的:(2019.01.27算法题:HDU - 1059)