Problem Description

在双胞胎兄弟Eric与R.W的生日会上,他们共收到了N个礼物,生日过后他们决定分配这N个礼物(numv+numw=N)。对于每个礼物他们俩有着各自心中的价值vi和wi,他们要求各自分到的礼物数目|numv-numw|<=1,并且各自所衡量的礼物价值的差值|sumv-sumw|尽可能小,现在他们想知道最小的差值是多少。

 Input

第一行为一个整数表示数据组数T。 接下来T组数组,每组数据第一行为一个整数N。(N<=30) 第二行有N个整数,表示Eric所衡量的每个礼物的价值vi。(1<=vi<=10000000) 第三行也有N个整数,表示R.W所衡量的每个礼物的价值wi。(1<=wi<=10000000)

 Output

对于每组数据,输出最小的差值。

 Sample Input

131  2  34  2  1

 Sample Output

1

思路:这题一开始比较容易想到的是把所有状态都枚举一遍,但是这样的复杂度为2^30次,稳稳的超时了。所以我们可以把n件物品拆成两半,前一半的个数为n/2,后一半的个数为n-n/2。然后我们先预处理出前一半的状态,用c[i][j]表示前一半有i件物品给eric的第j种情况sumv-sumw的值。然后对于每一个i,0<=i<=n/2,我们进行从小到大排序,这里的排序是为了之后的二分。接着,我们就可以处理后一半了,枚举后一半的所有状态(0~(1<<m2)-1),算出sumw-sumv的值,记录次状态下eric取的个数num,然后在c[n/2-num]中找到最接近sumw-sumv的值就行了。 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <stack>
using namespace std;
#define maxn 100050
#define inf 999999999
int v[40],w[40];
int c[17][1<<16],d[17]; int chazhao(int num,int sum)
{
int i,j,t,p1,p2,minx=inf;
t=lower_bound(c[num]+1,c[num]+1+d[num],sum )-c[num];
if(t==d[num]+1){
t--;
minx=min(minx,abs(c[num][t]-sum) ); }
else{
p1=t;p2=t;
if(p1!=1){
p1--;
minx=min(minx,abs(c[num][p1]-sum) );
}
minx=min(minx,abs(c[num][t]-sum));
if(p2!=d[num]){
p2++;
minx=min(minx,abs(c[num][p2]-sum) );
}
}
return minx;
} int main()
{
int n,m,i,j,T,m1,m2,state,tot,num,sum,t,p1,p2;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&v[i]);
}
for(i=1;i<=n;i++){
scanf("%d",&w[i]);
}
m1=n/2;
m2=n-m1;
memset(d,0,sizeof(d));
for(state=0;state<(1<<m1);state++){
tot=0;sum=0;
for(i=1;i<=m1;i++){
if(state&(1<<(i-1) )){
tot++;
sum+=v[i];
}
else sum-=w[i];
}
d[tot]++;
c[tot][d[tot] ]=sum;
}
for(i=0;i<=m1;i++){
sort(c[i]+1,c[i]+1+d[i]);
} int minx=inf;
for(state=0;state<(1<<m2);state++){
tot=0;sum=0;
for(i=1;i<=m2;i++){
if(state&(1<<(i-1))){
tot++;
sum-=v[m1+i];
}
else sum+=w[m1+i];
}
if((n%2==1) && (tot!=0) ){
num=n/2+1-tot;
minx=min(minx,chazhao(num,sum));
}
num=n/2-tot;
minx=min(minx,chazhao(num,sum));
}
printf("%d\n",minx);
}
return 0;
}

fzu2178礼物分配 (状压+二分)的更多相关文章

  1. Luogu P3092 [USACO13NOV]没有找零No Change【状压/二分】By cellur925

    题目传送门 可能是我退役/NOIP前做的最后一道状压... 题目大意:给你\(k\)个硬币,FJ想按顺序买\(n\)个物品,但是不能找零,问你最后最多剩下多少钱. 注意到\(k<=16\),提示 ...

  2. NOIP2016提高A组 A题 礼物—概率状压dp

    题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生 日礼物. 商店里一共有n种礼物.夏川每得到一种礼物,就会获得相应喜悦值Wi(每种礼物的喜悦值不能重复获得). 每次,店员会 ...

  3. 2018.08.19 NOIP模拟 dp(二分+状压dp)

    Dp 题目背景 SOURCE:NOIP2015-SHY-10 题目描述 一块土地有 n 个连续的部分,用 H[1],H[2],-,H[n] 表示每个部分的最初高度.有 n 种泥土可用,他们都能覆盖连续 ...

  4. 【BZOJ3312】[Usaco2013 Nov]No Change 状压DP+二分

    [BZOJ3312][Usaco2013 Nov]No Change Description Farmer John is at the market to purchase supplies for ...

  5. 【9.7校内测试】【二分+spfa】【最长上升子序列】【状压DP+贪心(?)】

    刘汝佳蓝书上的题,标程做法是从终点倒着$spfa$,我是二分答案正着$spfa$判断可不可行.效果是一样的. [注意]多组数据建边一定要清零啊QAQ!!! #include<iostream&g ...

  6. hdu 3681(bfs+二分+状压dp判断)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681 思路:机器人从出发点出发要求走过所有的Y,因为点很少,所以就能想到经典的TSP问题.首先bfs预 ...

  7. HDU-3681-Prison Break(BFS+状压DP+二分)

    Problem Description Rompire is a robot kingdom and a lot of robots live there peacefully. But one da ...

  8. [luoguP3092] [USACO13NOV]没有找零No Change(状压DP + 二分)

    传送门 先通过二分预处理出来,每个硬币在每个商品处最多能往后买多少个商品 直接状压DP即可 f[i]就为,所有比状态i少一个硬币j的状态所能达到的最远距离,在加上硬币j在当前位置所能达到的距离,所有的 ...

  9. 20190716NOIP模拟赛T1 礼物(概率dp+状压)

    题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生 日礼物. 商店里一共有种礼物.夏川每得到一种礼物,就会获得相应喜悦值Wi(每种 礼物的喜悦值不能重复获得). 每次,店员会 ...

随机推荐

  1. LeetCode561 数组拆分 I

    给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大. 示例 ...

  2. 【.NET 与树莓派】使用 GPIO 库

    上回老周在说准备工作的时候,提到过树莓派用金属盒散热的事情.有朋友会说,加了金属盒子接线不方便,就算用了"T"形板,毕竟是把导线延长了的.其实扩展板就是把原有的引脚引出(类似于延长 ...

  3. myisam崩溃后发生损坏的概率比innodb高的原因

    myisam崩溃后发生损坏的概率比innodb高的原因

  4. CVE-2020-0796复现

    今天整理资料时发现了之前存的一个cve漏洞复现过程,当时打算跟着复现来着,后来也没去复现,今天刚好有时间,所以来复现一下这个漏洞 漏洞讲解 https://www.freebuf.com/vuls/2 ...

  5. [MRCTF2020]你传你🐎呢之.htaccess

    前言 最近,也是遇到了文件上传的文件,自己搭的靶场都不能用,今天,在这里又遇到了这个题.简单总结下,内容来自互联网,若有侵权,联系我. .htaccess简介 .htaccess文件(分布式配置文件) ...

  6. QT串口助手(二):参数配置

    作者:zzssdd2 E-mail:zzssdd2@foxmail.com 一.前言 主要实现功能 串口参数的配置:波特率.数据位.停止位.校验位 本机串口设备的查询与添加显示 串口设备的手动更新与打 ...

  7. Springmvc中参数的绑定

    .处理器适配器在执行Handler之前需要把http请求的key/value数据绑定到Handler方法形参数上. 1.默认支持的参数类型: HttpServletRequest,HttpServle ...

  8. 查看Java的汇编指令

    在IDEA配置VM options,打印汇编指令 -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly windows系统 下载插件 hsdis-amd6 ...

  9. cfsetispeed、cfsetospeed和cfsetspeed探究

    在我https://www.cnblogs.com/Suzkfly/p/11055532.html这篇博客中有一个疑问,就是在串口设置波特率的域中,没有将输入输出波特率分开,那为什么会有几个不同的设置 ...

  10. eNSP启动设备AR1失败记一次解决步骤

    eNSP稳定版本下载:   微信搜索公众号"疯刘小三" 关注后回复ensp即可获得下载链接地址 eNSP V100R002C00B510 Setup.exe 最近在用eNSp的时候 ...