生日礼物(背包问题)
题目
一对双胞胎兄妹同一天过生日,这一天,他们的朋友给他俩送来了礼物,每个人送的礼物都是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,这是最好的方案。
思路
想要使得两人的价值差最小,就要让两个人的价值尽可能的接近。我们先看最差的一种情况,也就是价值差最大的情况,让其中一个人每次都拿价值最小的那一本书(这里假设每次都是哥哥拿价值最少的书)。
对于样例来说礼物分配完之后哥哥拿的书总价值为3 + 7 + 8 + 2
也就是 20
,而妹妹拿的书的总价值为5 + 11 + 8 + 9
也就是33
,两人之间的价值差为13
。
从图中不难看出,想要使得两人最后的总价值尽可能的接近,只需要把妹妹比哥哥多出来的部分尽可能地分一半给哥哥。
解决方法
把每份礼物中的两本书的差价当作一个新的物品,用一个变量sum
记录所有的差价和(也就是新的物品的价值的和)然后对sum
的 一半 跑一个01背包就好了
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 45100;
int dp[N], v[N];
int main(){int n, sum = 0;cin >> n;for(int i = 1; i <= n; i++){int a, b;cin >> a >> b;v[i] = abs(a - b);sum += v[i];}int mm = sum >> 1;for(int i = 1; i <= n; i++)for(int j = mm; j >= v[i]; j--)if(dp[j] < dp[j - v[i]] + v[i])dp[j] = dp[j - v[i]] + v[i];cout << abs(sum - dp[mm] - dp[mm]);return 0;
}
生日礼物(背包问题)相关推荐
- ACM1881 01背包问题应用
01背包问题动态规划应用 acm1881毕业bg 将必须离开的时间限制看作背包容量,先将他们由小到大排序,然后在排完序的数组中对每个实例都从它的时间限制开始(背包容量)到它的延长时间进行遍历: 1 # ...
- 算法设计与分析第4章 动态规划(一)【背包问题】
第3章动态规划(一)[背包问题] 基本思想: 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,但是经分解得到的子问题往往不是互相独立的.不同子问题的数目常常只有多项式量级.在用 ...
- c语言-01背包问题
01背包问题 问题:有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 分析: 这是最基础的背包问题,特点是:每种物品仅有一件,可以选 ...
- 如何在高精度下求解亿级变量背包问题?
导读:国际顶级会议WWW2020将于4月20日至24日举行.始于1994年的WWW会议,主要讨论有关Web的发展,其相关技术的标准化以及这些技术对社会和文化的影响,每年有大批的学者.研究人员.技术专家 ...
- 漫画:阿里巴巴四十大盗的故事-背包问题
今天,跟大家分享一个我关注了很久的公众号「兔保哥」.这个号是我看着她一点点写起来的,既有财经媒体人的客观严谨,又有身为妈妈的温暖贴心.如果你想用保险的力量守护家庭.为爱人遮风挡雨,可以关注她. --- ...
- 背包问题(多重背包+0-1背包)
一:0-1背包问题 #include<iostream> #include<algorithm> #include<cstring> const int maxn= ...
- 三十四、动态规划解决01背包问题
一.动态规划算法介绍 动态规划算法的核心思想是:将大问题划分为小问题进行解决,从而一步一步获取最优解的处理算法. 动态规划算法与分治算法类似,其基本思想是将待求解的问题分解成若干个子问题,先求子问题, ...
- 部分背包的贪婪算法 java_使用JAVA实现算法——贪心算法解决背包问题
packageBasePart;importjava.io.BufferedReader;importjava.io.FileInputStream;importjava.io.IOException ...
- 01背包和完全背包问题
01背包和完全背包问题 posted on 2019-04-20 17:39 sofu6 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/dusf/ ...
最新文章
- 虚拟机VMware操作系统安装
- #pragma message的作用
- 深度学习(十二)稀疏自编码
- 2022年美国大学生数学建模竞赛——Problem E:林业固碳
- 从send函数和sendto函数参数的不同看TCP和UDP的差别
- java学习(一)多态
- POJ 3126 Prime Path 简单广搜(BFS)
- Ubuntu 16.04 安装 搜狗输入法 sogou input
- linux离线安装pg数据库
- jdk32位安装包下载_PS2018下载AdobePhotoshopCC2018安装激活教程
- Assign array to a variable before exporting as module default
- 夜神模拟器+Burp抓包(简直是后端复现调试的福音)
- 虎牙、斗鱼同道同命:共同御寒
- 怎么用c语言画余弦函数,用c语言绘制余弦函数图像
- intellij idea报错:类文件具有错误的版本 61.0, 应为 52.0
- 商云通安装(一):电信搭建SIP电话环境
- MacPorts卡在正在运行软件包脚本解决方法
- bootloader的功能介绍
- 星速配资:煤炭概念板块指数上行 跑赢上证指数
- 汉化软件Radialix 3的使用
热门文章
- 数据分析常用五个方法三个模型(逻辑分析、多维度拆解、对比分析、假设验证、相关性分析、RFM模型、漏斗分析模型、AARRR模型)
- el-menu设置侧边栏使选项默认高亮与当前网址一致
- 做空无异于飞蛾扑火,什么时候才能一帆风顺?
- openJDK源码下载及阅读
- 美国首只杠杆比特币期货ETF开盘,成交量近550万美元!
- 联翔股份——2022年5月10日申购
- 解决Vmware Workstation环境下CentOs7网络连接激活失败的问题
- python3*1**3 表达式输出结果为_下列 Python语句的输出结果是?
- 硬件设计基础 —— 电流、电压、功率
- 用计算机弹吃鸡,Win10系统玩吃鸡提示游戏缺少msvcp140.dll的解决方法