博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU-1171 Big Event in HDU(生成函数/背包dp)
阅读量:4958 次
发布时间:2019-06-12

本文共 1189 字,大约阅读时间需要 3 分钟。

题意

给出物品种类,物品单价,每种物品的数量,尽可能把其分成价值相等的两部分。

思路

背包的思路显然是用一半总价值当作背包容量。

生成函数则是构造形如$1+x^{w[i]}+x^{2*w[i]}+...+x^{num[i]*w[i]}$的多项式,找到离$sum/2$最近的就完事。

代码

#include 
#define DBG(x) cerr << #x << " = " << x << endl;using namespace std;const int N = 300000 + 5;int n, w[N], num[N], c[2][N * 10];int main() { while(~scanf("%d", &n) && n > 0) { memset(c, 0, sizeof c); int sum = 0, ysum = 0;; for(int i = 1; i <= n; i++) { scanf("%d%d", &w[i], &num[i]); ysum += w[i] * num[i]; sum += w[i] * num[i]; } sum /= 2; for(int i = 0; i * w[1] <= sum && i <= num[1]; i++) c[1][i * w[1]] = 1; for(int i = 2; i <= n; i++) { for(int j = 0; j <= sum; j++) { if(!c[1 - (i & 1)][j]) continue; for(int k = 0; k <= w[i] * num[i] && j + k <= sum; k += w[i]) c[i & 1][j + k] += c[1 - (i & 1)][j]; } for(int j = 0; j <= sum; j++) c[1 - (i & 1)][j] = 0; } int tmp = sum; while(!c[n & 1][tmp]) tmp--; printf("%d %d\n", max(tmp, ysum - tmp), min(tmp, ysum - tmp)); } return 0;}

  

转载于:https://www.cnblogs.com/DuskOB/p/10618990.html

你可能感兴趣的文章
Enterprise Library 2.0 -- Cryptography Application Block
查看>>
简单的发邮件功能实现
查看>>
velocity模板引擎学习(3)-异常处理
查看>>
OllyDBG 1.10
查看>>
[svc][op]杀进程
查看>>
linux安装jdk
查看>>
求1+2+3+...+n
查看>>
[EXP]Microsoft Windows CONTACT - Remote Code Execution
查看>>
【面试】MySQL 中NULL和空值的区别?
查看>>
用js判断 iPhone6 iPhone6 plus iphonex?
查看>>
NOIp2016 蚯蚓 【二叉堆/答案单调性】By cellur925
查看>>
NOIp知识集合 By cellur925
查看>>
Nginx设置日志分割方法
查看>>
教学目标的表述方式──行为目标的ABCD表述法
查看>>
交换两个变量的值的若干种方法
查看>>
CKEditor 配置
查看>>
闪烁的文字
查看>>
IOS开发-点击View取消键盘输入
查看>>
标准库 string
查看>>
C++内联函数
查看>>