• 杭电ACM1171题,几种解法,背包,母函数等


    最近看了背包九讲,就想找个题目练练手,到网上搜了一下,说杭电的这一题是多重背包问题,就去做了。没想到,这一题做的异常痛苦,到现在自己的答案还没有通过的。痛苦归痛苦,还是学到了很多的。

    题目大意:有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,但是最后没通过,现在都不知道是不是对的。不过有人做对了,唉。。

  • 相关阅读:
    mysql权限管理
    centos 6.5安装node.js
    sublime 配置jade高亮显示
    解决国内npm依赖包安装慢的问题
    sublime text3配置node.js开发环境
    datepicker 时间戳转换问题
    关于c++正则表达式的用法
    Android系统binder机制的研究分析
    TCP/IP的分层复用问题
    关于设计模式中外观模式的研究以及关于设计模式中四大原则的理解
  • 原文地址:https://www.cnblogs.com/fanmingchun/p/4181325.html
Copyright © 2020-2023  润新知