• 杭电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,但是最后没通过,现在都不知道是不是对的。不过有人做对了,唉。。

  • 相关阅读:
    Nodejs学习笔记(三)--- 模块
    Nodejs学习笔记(二)--- 事件模块
    Nodejs学习笔记(一)--- 简介及安装Node.js开发环境
    leetcode题解实践
    坑爹的bugsbunnyctf复现
    两道interesting的题目
    python 习题集
    数据结构与算法--java描述
    pentestbox下运行ssh报错,命令报错
    ntfs交换数据流在隐写
  • 原文地址:https://www.cnblogs.com/fanmingchun/p/4181325.html
Copyright © 2020-2023  润新知