最近看了背包九讲,就想找个题目练练手,到网上搜了一下,说杭电的这一题是多重背包问题,就去做了。没想到,这一题做的异常痛苦,到现在自己的答案还没有通过的。痛苦归痛苦,还是学到了很多的。
题目大意:有N中物品,每种物品有价值和数目,把它们分成2部分。如何才能分的最均等?
1、最简单的方法,这种方法开始自己就想到了,但是执着于背包,就没去用。后来看到别人的解法,才后悔自己为什么没有去试试呢。
这个方法的思想就是,把所有的物品排序,然后按顺序添加进来,和总价值的一半比较。细节没想清楚,先占个位置。
2、母函数,这个问题正好适用于母函数。顺便也学了一下母函数。
母函数的大概思想:把相加问题,变成指数项的相乘问题。如有3枚硬币,分别是1、2、3面值的,求解组成各种面值的可能性。通过解方程(1+x^1)*(1+x^2)*(1+x^3)的结果得到每种面值的可能组合的个数。面值在指数项,而指数项前面的系数即为多少中组合。即若结果多项式中有2x^3,则面值为3的组合有2中。
通过用母函数,这个问题就打打简化了,可以直接套模版。即第i件物品可以表示为(1+x^V(i)+x^(2*V(i))...),把所有物品相乘,最后得到的多项式中,系数不为0且指数项最接近总价值的一半的指数项即为解。
自己的写的代码,出现了一个匪夷所思的错误,最后的c1[i]>0是错的,c1[i]!=0则对了,但是结果数组里面除了0就是正数呀,实在是想不通
3、抽象为背包。这个是一开始我用的方法,把这个问题当成多重背包问题,每个物品的weight为1,但是最后没通过,现在都不知道是不是对的。不过有人做对了,唉。。