POJ 1015 Jury Compromise dp
大致题意:
从n个候选人中选出m个人作为陪审团。为了让陪审团的选择更公平,辩方和控方都为这n个候选人给出了满意度(辩方为D[j],控方为P[j],范围0至20).现在要使得选出的m位候选人的辩方总和与控方总和的差最小,如果有多个最小,选择辩方总和与空方总和的和最大的那个方案。
分析:
一开始以为就是普通的01背包,结果代码一写,WA了。后来发现|D[j]-P[j]|并不构成最优子结构,所以不是01背包。题目要我们求出的方案辩方总和与控方总和的差最小,并且在这个前提下,使得辩方总和和控方总和的和最大。这个是有优先顺序的。因为有这个优先顺序,动态就容易找了。
设dif[i]为辩控差,sum[i]为辩控和。d[j][k]表示,选了j个候选人,使得这j个候选人的辩控差为k,最大的辩控和。
动态转移方程:dp[j][k]=dp[j-1][k-dif[i]]+sum[i]
为了让k不为负,都加上m*20即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; const int maxn=200+5;
const int maxm=20+5;
const int maxk=800+5;
int dif[maxn],sum[maxn];
int d[maxm][maxk];
int p[maxm][maxk];
int ans[maxm];
int cnt; bool solve2(int index,int j,int k)
{
for(;j>0;k-=dif[p[j][k]],j--)
if(p[j][k]==index) return false;
return true;
} int main()
{
//freopen("in.txt","r",stdin);
int n,m;
int time=0;
while(cin>>n>>m,n)
{
for(int i=1; i<=n; i++)
{
int D,P;
scanf("%d%d",&D,&P);
dif[i]=D-P;
sum[i]=D+P;
}
memset(d,-1,sizeof(d));
memset(p,0,sizeof(p));
int fixed=m*20;
d[0][fixed]=0;
for(int j=1; j<=m; j++)
for(int k=0; k<=fixed*2; k++)
{
int maxs=-1;
for(int i=1; i<=n; i++)
if(k-dif[i]>=0 && k-dif[i]<=fixed*2 && d[j-1][k-dif[i]]>=0
&& solve2(i,j-1,k-dif[i]) && d[j-1][k-dif[i]]+sum[i]>maxs)
{
maxs=d[j-1][k-dif[i]]+sum[i];
p[j][k]=i;
}
d[j][k]=maxs;
}
int sum1=0,sum2=0,pos;
for(int i1=fixed,i2=fixed; i1>=0; i1--,i2++)
if(d[m][i1]>=0 || d[m][i2]>=0)
{
pos=i1;
pos=d[m][i2]>d[m][i1]? i2:pos;
break;
}
cnt=0;
for(int j=m,k=pos;j>0;k-=dif[p[j][k]],j--)
ans[cnt++]=p[j][k];
sort(ans,ans+cnt);
for(int i=0; i<cnt; i++)
{
sum1+=(dif[ans[i]]+sum[ans[i]])/2;
sum2+=(sum[ans[i]]-dif[ans[i]])/2;
}
printf("Jury #%d \nBest jury has value %d for prosecution and value %d for defence: \n ",++time,sum1,sum2);
for(int i=0; i<cnt; i++)
printf("%d ",ans[i]);
printf("\n");
}
}
POJ 1015 Jury Compromise dp的更多相关文章
- POJ 1015 Jury Compromise dp分组
第一次做dp分组的问题,百度的~~ http://poj.org/problem?id=1015 题目大意:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑 ...
- 背包系列练习及总结(hud 2602 && hdu 2844 Coins && hdu 2159 && poj 1170 Shopping Offers && hdu 3092 Least common multiple && poj 1015 Jury Compromise)
作为一个oier,以及大学acm党背包是必不可少的一部分.好久没做背包类动规了.久违地练习下-.- dd__engi的背包九讲:http://love-oriented.com/pack/ 鸣谢htt ...
- POJ 1015 Jury Compromise(双塔dp)
Jury Compromise Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33737 Accepted: 9109 ...
- OpenJudge 2979 陪审团的人选 / Poj 1015 Jury Compromise
1.链接地址: http://bailian.openjudge.cn/practice/2979 http://poj.org/problem?id=1015 2.题目: 总Time Limit: ...
- poj 1015 Jury Compromise(背包+方案输出)
\(Jury Compromise\) \(solution:\) 这道题很有意思,它的状态设得很...奇怪.但是它的数据范围实在是太暴露了.虽然当时还是想了好久好久,出题人设了几个限制(首先要两个的 ...
- poj 1015 Jury Compromise(背包变形dp)
In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting of ...
- POJ 1015 Jury Compromise(dp坑)
提议:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m人组成陪审团.选m人的办法是:控方和辩方会根据对候选 ...
- POJ 1015 Jury Compromise【DP】
罗大神说这题很简单,,,,然而我着实写的很难过... 题目链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110495#proble ...
- HDU POJ 1015 Jury Compromise(陪审团的人选,DP)
题意: 在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m人组成陪审团.选m人的办法是:控方和辩方会根据对候 ...
随机推荐
- sosreport -a --report
sosreport -a --report 时间:2019-09-28 本文章向大家介绍sosreport -a --report,主要包括sosreport -a --report使用实例.应用技巧 ...
- sed -n "29496,29516p" service.log:从29496行开始检索,到29516行结束
在工作中常用的Linux命令 javalinux 发布于 2019-07-24 约 11 分钟 前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://gith ...
- Python3统计gitlab上的代码量
import threading import gitlab import xlwt #获取所有的user def getAllUsers(): usersli = [] client = gitla ...
- 手机APP远程空气质量监测应用
http://club.gizwits.com/thread-3876-1-1.html
- 【补档STM32】STM32F103俄罗斯方块游戏实现
项目地址:https://gitee.com/daycen/stm32-tetris/tree/master 使用Keil uVision5打开即可 一.概述 本文介绍了一个基于STM32的俄罗斯 ...
- Python - random 库的详细使用
前言 为啥突然写这个?因为用到就写呗,感觉对生成数据很有用,之前都是百度别人的,今天来对着官方文档写,超级标准! 这边只讲常用的,看了下文档还有什么数学方法,太高级好像用不上 返回整数 random. ...
- 使用Python操作InfluxDB时序数据库
使用Python操作InfluxDB时序数据库 安装python包 influxdb,这里我安装的是5.3.0版本 pip install influxdb==5.3.0 使用 from infl ...
- Bringing up interface eth0: Error: No suitable device found: no device found for connection 'System eth0'.
在VMware的虚拟机中克隆CentOS,在重启网卡的时候报错: Shutting down loopback interface: [ OK ] Bringing up loopback int ...
- Tensorflow 2.0 搭建神经网络(局部)
前向传播 tensorflow.keras 搭建网络时,内部的网络可以直接完成所有层的前向计算.全连接Dense() 层,最后一层的神经元的个数需要和最后一层线性函数 w x + b 的维度对应上,中 ...
- H.264/H265码流解析
H.264/H265码流解析 一.H.264码流解析 一个原始的H.264 NALU 单元常由 [StartCode] [NALU Header] [NALU Payload] 三部分组成 一个原始的 ...