大致题意:

从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. IPMI中sol的使用

    IPMI中sol的使用 转载韦远科 最后发布于2013-05-09 15:19:18 阅读数 7920  收藏   http://blog.chinaunix.net/uid-1838361-id-3 ...

  2. 攻防世界(十一)warmup

    攻防世界系列 :warmup 1.打开题目,一个贱贱的滑稽表情 F12看到注释内容source.php 2.访问source.php <?php highlight_file(__FILE__) ...

  3. Centos7 cache/buff过高处理方法

    Centos7 cache/buff过高处理方法   kevinxliu关注0人评论36799人阅读2018-07-26 10:09:59   当linux运行久点,会产生很多不必要的cache或者b ...

  4. python3 ftplib模块连接FTP

    from ftplib import FTP_TLS import os import re class MyFtp(FTP_TLS): """继承FTP类"& ...

  5. SystemVerilog MCDF比较器

    checker肩负了模拟设计行为和功能检查任务. 功能: 缓存从各个monitor手机到的数据. ton过比较器检查实际收集到的DUT输出端口数据是否同reference module(参考模型)产生 ...

  6. java和kotlin的可见性修饰符对比

    private 意味着只在这个类内部(包含其所有成员)可见: protected-- 和 private一样 + 在子类中可见. internal -- 能见到类声明的 本模块内 的任何客户端都可见其 ...

  7. downloader middleware的三个methods不同返回的情况

    要激活一个meddleware, 要在设置里面添加.例如: DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.CustomDownloaderMidd ...

  8. DDD中限界上下文与通用语言的作用

    什么是通用语言 通用语言, 最主要的目的就是减少交流中信息丢失, 在实际开发中, 可能关联很多人, 例如有业务层面的业务细节制定者.领域专家.产品经理.项目经理 .架构师.开发经理.测试经理等等, 即 ...

  9. 使用OneFlow搭建神经网络

    使用OneFlow搭建神经网络 在 识别 MNIST 手写体数字 的例子中,通过 flow.layers 和 flow.nn 中提供的接口搭建了一个简单的 LeNet 网络.下面,将通过LeNet来介 ...

  10. 如何写新的C++ OP

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