【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][ ...
随机推荐
- 22. Spring Boot 动态数据源(多数据源自动切换)
转自:https://blog.csdn.net/catoop/article/details/50575038
- 1.10 Python基础知识 - 序列:列表
在Python中有很多的组合数据类型,其中包括列表,元组,字符串等数据类型,这些数据类型统称为序列类型,用他们可以处理复杂的数据. 列表,是一组有序元素组合的数据结构.列表是可变的数据类型. 列表采用 ...
- 基于mpvue的小程序项目搭建的步骤
mpvue 是美团开源的一套语法与vue.js一致的.快速开发小程序的前端框架,按官网说可以达到小程序与H5界面使用一套代码.使用此框架,开发者将得到完整的 Vue.js 开发体验,同时为 H5 和小 ...
- C#中对XML的操作
现在有一个xml文件,名称:BookStore.xml,数据如下: <?xml version="1.0" encoding="gb2312"?>& ...
- JS概述
从Asp.NET跨越到JavaScript.这既是一个新的领域也是一个非常熟悉的地方,新是由于不知道什么是JavaScript,首先来了解一下什么是JavaScript. ...
- 页面事件(Init,Load,PreRender)执行顺序
简介 对由 Microsoft® Internet 信息服务 (IIS) 处理的 Microsoft® ASP.NET 页面的每个请求都会被移交到 ASP.NET HTTP 管道.HTTP 管道由一系 ...
- 格式化时间的一个好方法(补充moment)
/** * * 格式化时间 * @param {*} time * @param {*} fmt * @returns * time(new Date(), 'yyyy/MM/dd') ==> ...
- JS版微信6.0分享接口用法分析
本文实例讲述了JS版微信6.0分享接口用法.分享给大家供大家参考,具体如下: 为了净化网络,整顿诱导分享及诱导关注行为,微信于2014年12月30日发布了<微信公众平台关于整顿诱导分享及诱导关注 ...
- js进阶ajax函数封装(匿名函数作为参数传递)(封装函数引入文件的方式非常好用)
js进阶ajax函数封装(匿名函数作为参数传递)(封装函数引入文件的方式非常好用) 一.总结 2.匿名函数作为参数传递 二.js进阶ajax函数封装 ajax1.js function ajax(ur ...
- C#操作SqlServer MySql Oracle通用帮助类
C#操作SqlServer MySql Oracle通用帮助类 [前言] 作为一款成熟的面向对象高级编程语言,C#在ADO.Net的支持上已然是做的很成熟,我们可以方便地调用ADO.Net操作各类关系 ...