NOI-砝码称重v2 多重背包 生成函数
描述
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=100,000),要求:计算用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况。
输入
一行,包括六个正整数a1,a2,a3,a4,a5,a6,表示1g砝码有a1个,2g砝码有a2个,……,20g砝码有a6个。相邻两个整数之间用单个空格隔开。
输出
以“Total=N”的形式输出,其中N为可以称出的不同重量的个数。
样例输入
1 1 0 0 0 0
样例输出
Total=3
提示
样例给出的砝码可以称出1g,2g,3g三种不同的重量。
思路: 我们看到每种砝码有num[i]个 如何做这道题呢
我们考虑背包
有不同价值的六种物品 问我们能如何组合获得一共多少种不同的价值 背包问题换个问法
我们发现这个问题其实是把物品的价值和花费合二为一了
对不同物品选几个 其实就能获得多少价值
如何做这道题 由于最大称重已经给出来了 我们如果考虑多重背包
那么首先需要枚举物品
再枚举有效空间 这里的空间就是最大称重
再枚举个数
因为我有100000最大的数 也就是最多有100000个不同的称重可能
我们不妨用d[i]表示i重量称重能够称到
那么如果d[v]能够称到的话前提是d[v-个数*价值]已经称到
所以这个问题其实就是 多重背包问题
设输入的质量为w的砝码n个,则可以用母函数表示为:
针对本题目,例如输入六种砝码(1g,2g,3g,5g,10g,20g)的个数分别为:1,2,2,0,0,1。则有:
则最终结果就是f1*f2*f3*f4中的次数不同的项 每个不同的项前面的系数就是一共有几种方案能称到这种结果
总结
以上是生活随笔为你收集整理的NOI-砝码称重v2 多重背包 生成函数的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 利用Python收发邮件
- 下一篇: MobX快速入门教程(重要概念讲解)