【u220】生日礼物
Time Limit: 1 second
Memory Limit: 128 MB
【问题描述】
一对双胞胎兄妹同一天过生日,这一天,他们的朋友给他俩送来了礼物,每个人送的礼物都是2本书,一本给哥哥,一本给妹妹,但没有说
明哪本是给妹妹的,哪本是给哥哥的,每本书都有自己的价值,为了避免冲突,让你来分配,要求使得两人所获得书本的价值和之间的
差距尽可能的小。
例如,有4个礼物:(3,5),(7,11),(8,8),(2,9),可以把3,7,8,2分配给妹妹,其余的给哥哥,价值差为:5+11+8+9-3-7-8-2=13;如果把3,7
,8,9给妹妹,其余的给哥哥,价值差为:3+7+8+9-5-11-8-2=1,这是最好的方案。
【输入格式】
输入文件gift.in的第一行包含一个正整数N,表示礼物的数量,接下来N行,每行两个整数,表示每份礼物两本书的价值(价值范围在1到300之间)。
【输出格式】
输出文件gift.out包含一个非负整数,表示最小的价值差。
【数据规模】
对于20%的数据,有N≤20; 对于40%的数据,有N≤50; 对于100%的数据,有N≤150。
Sample Input1
4
3 5
7 11
8 8
2 9
Sample Output1
1
【题解】
这题是把背包用作一个工具。来判断出2*n个数字按照规则不同的组合会产生的最后总价值可能是什么。
动态转移方程这样写
for (int i = 1; i<= n;i++)
for (int j = 300*150+10;j>=0;j--)
if (f[j])
{
f[j] = false;
f[j+a[i][0]] = true,f[j+a[i][1] = true;
}
其中f[]一个bool型的一维数组。
然后我们之所以遇到一个f[j]就把f[j]置为false,是因为。要保证每一个礼物都被用到。
比如f[4]是前两个礼物可能达到的值,我们在更新第四个礼物的时候会遇到f[4]为true,但是我们不能用他来更新f[4+a[i][0]]或f[4+a[i][1]],因为这样我们会有第三个礼物没有用。直接跳到了第4个礼物。这样会导致最后有一些数字是在没有用满n个数字的情况下累加得到的。最后得到2*n个数字不同组合可能达到的累加和之后。我们累加所有的数字之和为dd,然后从dd/2开始枚举一直递增。直到f[i]为真。然后用k记录这个i。则dd-k就是另外一个数字。因为我们是从dd/2开始枚举的,可以肯定,这两个数字一定是最接近的。
最后输出两个数字之差就可以了。
【代码】
#include <cstdio>
#include <cmath> int n,a[151][2],dd = 0;
bool f[300*150 + 10] = {0}; int main()
{
//freopen("F:\\rush.txt","r",stdin);
scanf("%d",&n);
for (int i = 1;i <= n;i++)
scanf("%d%d",&a[i][0],&a[i][1]),dd+= (a[i][0] + a[i][1]);//dd一边累加所有的数字之和
f[0] = true;
for (int i = 1;i <= n;i++)
for (int j = 300*150 +2;j >=0;j--)
if (f[j])
{
f[j] = false;
f[j+a[i][0]] = true;
f[j+a[i][1]] = true;
} //将背包当做工具,获取最后能累加到哪些数字
int k;
for (int i = (dd / 2);i <=dd;i++) //从dd/2开始枚举,直到找到一个数字 他可以由n个数字累加得到
if (f[i])
{
k = i;
break;
}
int temp = dd-k; //这是另外一个数字
if (temp > k) //根据大小关系输出他们的差就好了。
printf("%d",temp-k);
else
printf("%d",k-temp);
return 0;
}
【u220】生日礼物的更多相关文章
- 【BZOJ】【1293】【SCOI2009】生日礼物
二分/堆 求一个最小的区间使得包含所有的颜色(并不一定只出现一次)$n\leq 10^6$ 我想的做法是:二分这个最小的长度(满足单调性……好久才想到QAQ),然后O(n)判断是否有可行的区间,这一步 ...
- 华为上机:Tom的生日礼物
Tom的生日礼物 描述: 四月一日快到了,Tom想了个愚人的好办法——送礼物.嘿嘿,不要想的太好,这礼物可没那么简单,Tom为了愚人,准备了一堆盒子,其中有一个盒子里面装了礼物.盒子里面可以再放零个或 ...
- 【链表】BZOJ 2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 382 Solved: 111[Submit][S ...
- BZOJ2288: 【POJ Challenge】生日礼物
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 284 Solved: 82[Submit][St ...
- 1293: [SCOI2009]生日礼物
1293: [SCOI2009]生日礼物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1096 Solved: 584[Submit][Statu ...
- CJOJ 2485 UVa 11991 生日礼物 / UVa 11991 Easy Problem from Rujia Liu?
CJOJ 2485 UVa 11991 生日礼物 / UVa 11991 Easy Problem from Rujia Liu? Description (原题来自刘汝佳<训练指南>Pa ...
- TurnipBit:和孩子一起动手DIY“滚动”的生日礼物
当孩子的生日来临之时,做父母的总是会为该为孩子准备什么礼物而烦恼.下面就教家长朋友们利用TurnipBit开发板DIY一份"特殊"的生日礼物,不仅能增加与孩子的互动性还能提升孩子在 ...
- BZOJ 1293: [SCOI2009]生日礼物【单调队列】
1293: [SCOI2009]生日礼物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2534 Solved: 1383[Submit][Stat ...
- bzoj 2288 【POJ Challenge】生日礼物 双向链表+堆优化
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1003 Solved: 317[Submit][ ...
随机推荐
- DriverModule_01
最小驱动模块: 最简单的Makefile 无配置文件 最小驱动的四部分 头文件 声明模块信息 模块驱动的入口.出口 功能区 关于这个头文件的分析: linux头文件的位置,例如#include< ...
- Cscope how to support java and c++
Cscope 首先在文件夹下建立cscope索引文件 find -name '*.c' > cscope.file cscope -Rbkq 这个命令会生成三个文件:cscope.out, cs ...
- PHP模拟链表操作
PHP模拟链表操作 一.总结 1.类成员用的是-> 2.对象节点相连的话,因为是对象,所以不用取地址符号 3.数组传递参数的时候传引用的方法 ,& 二.PHP模拟链表操作 代码一: /* ...
- [Angular] New async 'as' syntax and ngIf.. else
From Anuglar v4 above, we are able to using 'as' with async pipe. This allow as using 'new variable' ...
- 关于 /etc/zabbix/zabbix_agentd.conf 文件 Hostname 文件的说明
前提 (1) /etc/hosts 文件如下 [root@testdb ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain loc ...
- 【Codeforces Round #440 (Div. 2) B】Maximum of Maximums of Minimums
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] k=1的时候就是最小值, k=2的时候,暴力枚举分割点. k=3的时候,最大值肯定能被"独立出来",则直接输出最 ...
- 关于Linux启动时挂载rootfs的几种方式
一直对Linux启动时挂载根文件系统的过程存在着很多疑问,今天在水木精华区找到了有用的资料,摘录如下: 1.Linux启动时,经过一系列初始化之后,需要mount 根文件系统,为最后运行init进程等 ...
- ZOJ 1796 Euchre Results 数学水题
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1796 题意: 四个人玩游戏,已知三个人的输赢情况,求第四个人的输赢情况. ...
- Linux下搭建Memcached缓存系统
首先说下抱歉,博主近期单位经常加班.博客更新有点慢.希望大家理解,草稿箱里存了不少内容,等不忙时候一点点填坑~ 在一般的站点开发学习时候.都会把数据存放在RDBMS(关系型数据库系统(Relation ...
- hibernate---java.lang.UnsupportedOperationException: The user must supply a JDBC connection
在配置hibernate时.运行代码时一直抛错: Exception in thread "main" java.lang.UnsupportedOperationExce ...