大致题意:

从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的更多相关文章

  1. POJ 1015 Jury Compromise dp分组

    第一次做dp分组的问题,百度的~~ http://poj.org/problem?id=1015 题目大意:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑 ...

  2. 背包系列练习及总结(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 ...

  3. POJ 1015 Jury Compromise(双塔dp)

    Jury Compromise Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33737   Accepted: 9109 ...

  4. OpenJudge 2979 陪审团的人选 / Poj 1015 Jury Compromise

    1.链接地址: http://bailian.openjudge.cn/practice/2979 http://poj.org/problem?id=1015 2.题目: 总Time Limit: ...

  5. poj 1015 Jury Compromise(背包+方案输出)

    \(Jury Compromise\) \(solution:\) 这道题很有意思,它的状态设得很...奇怪.但是它的数据范围实在是太暴露了.虽然当时还是想了好久好久,出题人设了几个限制(首先要两个的 ...

  6. poj 1015 Jury Compromise(背包变形dp)

    In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting of ...

  7. POJ 1015 Jury Compromise(dp坑)

    提议:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m人组成陪审团.选m人的办法是:控方和辩方会根据对候选 ...

  8. POJ 1015 Jury Compromise【DP】

    罗大神说这题很简单,,,,然而我着实写的很难过... 题目链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110495#proble ...

  9. HDU POJ 1015 Jury Compromise(陪审团的人选,DP)

    题意: 在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m人组成陪审团.选m人的办法是:控方和辩方会根据对候 ...

随机推荐

  1. JNLP配置WIN10

    依据网友的反响和我自己的考查,发觉JNLP的情况是大多数网友的困惑之处,针对此问题小编给大总结整理了(关键此)的处理技巧,并对它进以加工改善,整理出JNLP的详细教程,只用你按照1:首先配置电脑的ja ...

  2. Spring Cloud(Dalston.SR1)

    Spring Cloud 示例项目地址:https://github.com/Yanshaoshuai/microservicecloud Eureka 集群搭建 microservicecloud- ...

  3. 066.Python框架DRF之序列化器Serializer

    一 序列化器-Serializer 作用: 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 反序列化,把客户端发送过来的数据,经过request以后变成 ...

  4. s40 KVM虚拟化企业级实战

    1-为何使用虚拟化 02-KVM虚拟化环境准备 yum install libvirt* virt-* qemu-kvm* -y [root@cs7-kvm ~]# systemctl start l ...

  5. MyBatis的Example如何按条件排序(Day_35)

    MyBatis的Example如何按条件进行排序? 背景:有时我们在使用mybatis example 进行查询时,需要进行相应的业务排序.本博客以下图为例 @Override public List ...

  6. Django基本文件配置

    1.setting.py (1) ALLOWED_HOSTS = ['*'] (2) INSTALLED_APPS = ['app_name'] (3) TEMPLATES 中的   'DIRS': ...

  7. UnicodeDecodeError:'ascii' codec can't decode byte 0xe5 in position 89: ordinal not in range(128)

    环境python2,在出现该错误的python文件,增加: import sys reload(sys) sys.setdefaultencoding('utf8') 重新运行,不再报错

  8. Django优雅集成MongoDB

    Django优雅集成MongoDB   将Django与MongoDB集成 在不更改Django ORM的情况下,将MongoDB用作Django项目的后端数据库.使用Django Admin在Mon ...

  9. MongoDB学习笔记:MongoDB 数据库的命名、设计规范

    MongoDB学习笔记:MongoDB 数据库的命名.设计规范     第一部分,我们先说命名规范. 文档 设计约束 UTF-8 字符 不能包含 \0 字符(空字符),这个字符标识建的结尾 . 和 $ ...

  10. 如何写新的C++ OP

    如何写新的C++ OP 概念简介 简单介绍需要用到基类,详细介绍请参考设计文档. framework::OperatorBase: Operator(简写,Op)基类. framework::OpKe ...