POJ1015 && UVA - 323 ~Jury Compromise(dp路径)
Based on the grades of the two parties, the judge selects the jury. In order to ensure a fair trial, the tendencies of the jury to favour either defence or prosecution should be as balanced as possible. The jury therefore has to be chosen in a way that is satisfactory to both parties.
We will now make this more precise: given a pool of n potential jurors and two values di (the defence's value) and pi (the prosecution's value) for each potential juror i, you are to select a jury of m persons. If J is a subset of {1,..., n} with m elements, then D(J ) = sum(dk) k belong to J
and P(J) = sum(pk) k belong to J are the total values of this jury for defence and prosecution.
For an optimal jury J , the value |D(J) - P(J)| must be minimal. If there are several jurys with minimal |D(J) - P(J)|, one which maximizes D(J) + P(J) should be selected since the jury should be as ideal as possible for both parties.
You are to write a program that implements this jury selection process and chooses an optimal jury given a set of candidates.
Input
These values will satisfy 1<=n<=200, 1<=m<=20 and of course m<=n. The following n lines contain the two integers pi and di for i = 1,...,n. A blank line separates each round from the next.
The file ends with a round that has n = m = 0.
Output
On the next line print the values D(J ) and P (J ) of your jury as shown below and on another line print the numbers of the m chosen candidates in ascending order. Output a blank before each individual candidate number.
Output an empty line after each test case.
Sample Input
4 2
1 2
2 3
4 1
6 2
0 0
Sample Output
Jury #1
Best jury has value 6 for prosecution and value 4 for defence:
2 3
Hint
在一个遥远的国家弗罗地亚,法庭审判的裁决由一个由普通大众组成的陪审团决定。
每次审判开始时,都必须选择一个陪审团,具体做法如下。首先,有几个人是从公众中随机抽取的。
对于这个池中的每个人来说,辩护和起诉分配从0到20的等级,表示他们偏爱这个人。
0意味着完全不喜欢,20另一方面意味着这个人被认为是理想的陪审团。
根据双方的等级,法官选择陪审团。为了确保公平的审判,陪审团支持辩护或起诉的趋势应尽可能平衡。
因此,陪审团必须以双方满意的方式选择。
我们现在要做的更加精确:给予每个潜在陪审员我有n个潜在陪审员和两个价值di(辩护人的价值)和pi(检察官的价值),
你应该选择一个m人陪审团。如果J是具有m个元素的{1,...,n}的子集,则D(J)= sum(dk)k属于J
并且P(J)= sum(pk)k属于J是这个辩护和起诉陪审团的总值。
对于最佳陪审团J,值| D(J) - P(J)|必须最小化。如果存在几个最小| D(J) - P(J)|的陪审团,
应该选择最大化D(J)+ P(J)的陪审团,因为陪审团对于双方来说应尽可能理想。
你应该编写一个程序来实现这个陪审团的选择过程,并为一组候选人选择一个最佳陪审团。
上一篇博客我写的是,最长上升子序列的变形,求DP路径
这篇是01背包的变形也需要求路径,现在我会的DP也就背包和最长上升子序列。
求| D(J) - P(J)|的最小值
我现在对DP的感觉就是求最优解。也许这就是菜鸡吧。
这题的转移方程我还没有推出来,还是靠看大佬博客才会的。
先讲DP等下再去讲路径,
dp[i][j]表示选择了 i 个人 差值和 | D(J) - P(J)| = j ,在这个两个条件下的和值 D(J)+ P(J)的最大值。
构造了一个二维DP 就很好的可以推出转移方程了。
应该这个差值有正有负 所以我就设参考点为 pmax=20*m,这个是初始点,
这样处理的原因是怕数组越界。毕竟没有下标为负数的元素。
最后的一个问题就是打印路径了
这里用的是vector 数组进行处理 因为这题的数据比较少,用vector也行,
这题还有一个坑点就是,可能会出现重复选择的情况
所以for (int k=0 ;k<n ;k++ ) 这样就可以避免了数据重复了,
最后一点DP的初始化还是难啊
#include<cstdio>
#include<ctype.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
int n,m,cas=,dp[][],a[],b[];
vector<int>path[][];
int main() {
while(scanf("%d%d",&n,&m),n,m){
for (int i= ;i< ;i++) {
for (int j= ;j< ;j++) {
dp[i][j]=-;
path[i][j].clear();
}
}
for (int i= ;i<n ;i++) {
int x,y;
scanf("%d%d",&x,&y);
a[i]=x-y;
b[i]=x+y;
}
int pmax=*m;
dp[][pmax]=;
for (int k= ;k<n ;k++ ){
for (int i=m- ;i>= ;i--){
for (int j= ;j<*pmax ;j++){
if (dp[i][j]>= ) {
if (dp[i+][j+a[k]]<=dp[i][j]+b[k]){
dp[i+][j+a[k]]=dp[i][j]+b[k];
path[i+][j+a[k]]=path[i][j];
path[i+][j+a[k]].push_back(k);
}
}
}
}
}
int i;
for (i= ; dp[m][pmax+i]==- && dp[m][pmax-i]==- ;i++);
int temp=(dp[m][pmax+i]>dp[m][pmax-i]) ? i:-i;
int sump=(dp[m][pmax+temp]+temp)/;
int sums=(dp[m][pmax+temp]-temp)/;
printf("Jury #%d\n",cas++);
printf("Best jury has value %d for prosecution and value %d for defence: \n",sump,sums);
for (int i= ;i<m ;i++) {
printf(" %d",path[m][pmax+temp][i]+);
}
}
return ;
}
POJ1015 && UVA - 323 ~Jury Compromise(dp路径)的更多相关文章
- POJ1015陪审团(Jury Compromise)——dp+路径记录
题目:http://poj.org/problem?id=1015 差值是有后效性的,所以“转化为可行性”,开一维记录“能否达到这个差值”. 当然可以开两维分别记录 a 和 b,但 “值只是0或1” ...
- POJ-1015 Jury Compromise(dp|01背包)
题目: In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting ...
- $POJ1015\ Jury\ Compromise\ Dp$/背包
洛谷传送门 $Sol$ 这是一道具有多个“体积维度”的$0/1$背包问题. 把$N$个候选人看做$N$个物品,那么每个物品有如下三种体积: 1.“人数”,每个候选人的“人数”都是$1$,最终要填满容积 ...
- POJ 1015 Jury Compromise dp分组
第一次做dp分组的问题,百度的~~ http://poj.org/problem?id=1015 题目大意:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑 ...
- POJ 1015 Jury Compromise dp
大致题意: 从n个候选人中选出m个人作为陪审团.为了让陪审团的选择更公平,辩方和控方都为这n个候选人给出了满意度(辩方为D[j],控方为P[j],范围0至20).现在要使得选出的m位候选人的辩方总和与 ...
- POJ 1015 Jury Compromise(双塔dp)
Jury Compromise Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33737 Accepted: 9109 ...
- poj1015 Jury Compromise【背包】
Jury Compromise Time Limit: 1000MS Memory Limit: 65536K Total Submissions:32355 Accepted:8722 ...
- 【题解】Jury Compromise(链表+DP)
[题解]Jury Compromise(链表+DP) 传送门 题目大意 给你\(n\le 200\)个元素,一个元素有两个特征值,\(c_i\)和\(d_i\),\(c,d \in [0,20]\), ...
- 背包系列练习及总结(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 ...
随机推荐
- sshpass的使用方法
author:headsen chen date : 2017-11-29 15:46:39 notice:created by headsen chen himself and not ...
- PHP MVC框架核心类
PHP MVC框架核心类 现在我们举几个核心框架的例子演示:在framework/core下建立一个Framework.class.php的文件.写入以下代码: // framework/core/F ...
- CCF-CSP 201709-4通信网络
问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M条通路,每条通路只能单向传递信息,即一条从部门a到部门b的通路只能由a向b传递信息.信息可以通过中转的方式进行传递,即如果a能将信息 ...
- Java 英文面试题
1. Q: What is HashMap and Map?A: Map is Interface and Hashmap is class that implements that. 2. Q: D ...
- 笔记:Spring Cloud Eureka 服务治理
Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能,服务 ...
- 什么是DOM,DOM level 1\2\3 的区别是什么
DOM 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.Document Object Model的历史可以追溯至1990年 ...
- js实现单双行文本溢出添加省略号
# 单双行文本溢出省略 ``` // 2. 当内容过多的时候,单行省略号: overflow: hidden; text-overflow:ellipsis; white-space: nowrap; ...
- Java多线程:线程池
一. 背景 线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池可以对线程进行统一的分配.调优和监控,并有以下好处: 第一:降低资源消耗.通过重复利用已 ...
- 获取服务器时间js代码
function getSevertime(){ var xmlHttp = new XMLHttpRequest(); if( !xmlHttp ){ xmlHttp = new ActiveXOb ...
- MongoDb进阶实践之三 Mongodb基本命令详解
一.引言 从今天开始,我要正式开始介绍MongoDB的使用方法了.在此之前,我用了两篇文章分别介绍了如何在Linux系统和Windows系统上安装和配置MongoDB系统.如 ...