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. 面试官:你真的了解Redis分布式锁吗?

    什么是分布式锁 说到Redis,我们第一想到的功能就是可以缓存数据,除此之外,Redis因为单进程.性能高的特点,它还经常被用于做分布式锁. 锁我们都知道,在程序中的作用就是同步工具,保证共享资源在同 ...

  2. [工作札记]02: .Net Winform控件TreeView最简递归绑定方法

    前言:Treeview控件是我们在WinForm.WebForm开发中经常使用的控件,需要从数据库动态加载数据,然后递归绑定每一个节点:同样,递归的思路在其他程序中也经常运用,包括.Net MVC等. ...

  3. Payment Spring Boot 1.0.4.RELEASE 发布,最易用的微信支付 V3 实现

    Payment Spring Boot 是微信支付V3的Java实现,仅仅依赖Spring内置的一些类库.配置简单方便,可以让开发者快速为Spring Boot应用接入微信支付. 欢迎ISSUE,欢迎 ...

  4. 2021年正确的Android逆向开发学习之路

    2021年正确的Android逆向开发学习之路 说明 文章首发于HURUWO的博客小站,本平台做同步备份发布.如有浏览或访问异常或者相关疑问可前往原博客下评论浏览. 原文链接 2021年正确的Andr ...

  5. ctfshow—web—web签到题

    打开靶机,发现只有一句话 查看源码 发现一段字符串,猜是base64加密 拿到flag

  6. AWD生存之道

    比赛开始阶段 常见漏洞的防御手段:https://www.freebuf.com/articles/web/208778.html 一.登陆SSH 重点 如果ssh的密码不是随机密码,记得一开始就进行 ...

  7. 查看pod日志无法查看的解决方式

    查看pod日志 [root@k8s-master1 ~]# kubectl logs nginx-7cdbd8cdc9-2qrcw Error from server (Forbidden): For ...

  8. postgresql数据库升级

    pg_upgrade官网介绍:https://www.postgresql.org/docs/10/pgupgrade.html 1.查看老版本数据库编译参数值并记录 select name,sett ...

  9. 浅谈JavaScript代码性能优化

    可以通过https://jsbench.me/测试网站完成性能测试. 一.慎用全局变量 1.全局变量定义在全局执行上下文,是所有作用域链的顶端,在局部作用域中没找到的变量都会到全局变量中去查找,所以说 ...

  10. 中断与系统调用深度分析(以网络编程接口SocketAPI为例)

    1.从计算机CPU与I/O设备的交互方式谈起 计算机CPU与I/O设备的交互方式有最早的程序查询(也叫轮询)方式,发展到后来的程序中断方式,DMA方式等.简单来说,最早的程序查询方式的机制是,CPU若 ...