poj1015 Jury Compromise【背包】
| Time Limit: 1000MS | Memory Limit: 65536K | |||
| Total Submissions:32355 | Accepted:8722 | Special Judge | ||
Description
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
Source
题意:
从n个候选人中选出m个,每个人有两个分数,分别是辩方和控方打出的。现在希望选出的这m个人,他们的辩方分数和与控方分数和之差的绝对值最小,当有多种情况时选择两个分数和最大的一种。还要输出方案。
思路:
感觉略难。
我们可以把n个候选人当做是n个物品,每个人的人数作为一维体积,装满容积为m的背包。每个候选人辩、控得分差作为体积之一,辩、控双方的得分和作为价值。dp[j][k]表示取j个候选人,使其辩控差为k的所有方案中,辩控和最大的那个方案。并且,我们还规定,如果没法选j 个人,使其辩控差为k,那么f(j, k)的值就为-1,也称方案f(j, k)不可行。本题是要求选出m 个人,那么,如果对k 的所有可能的取值,求出了所有的f(m, k) (-20×m≤ k ≤ 20×m),那么陪审团方案自然就很容易找到了。可行方案f(j-1, x)能演化成方案f(j, k)的必要条件是:存在某个候选人i,i 在方案f(j-1, x)中没有被选上,且x+V(i) = k。在所有满足该必要条件的f(j-1, x)中,选出 f(j-1, x) + S(i) 的值最大的那个,那么方案f(j-1, x)再加上候选人i,就演变成了方案 f(j, k)。这中间需要将一个方案都选了哪些人都记录下来。不妨将方案f(j, k)中最后选的那个候选人的编号,记在二维数组的元素path[j][k]中。那么方案f(j, k)的倒数第二个人选的编号,就是path[j-1][k-V[path[j][k]]。假定最后算出了解方案的辩控差是k,那么从path[m][k]出发,就能顺藤摸瓜一步步求出所有被选中的候选人。
//#include <bits/stdc++.h>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<stdio.h>
#include<cstring>
#include<map> #define inf 0x3f3f3f3f
using namespace std;
typedef long long LL; int n, m;
const int maxn = ;
const int maxm = ;
int p[], d[], ans[];
int dp[][], path[][]; int main()
{
int cas = ;
while(scanf("%d %d", &n, &m) != EOF && (n || m)){ for(int i = ; i <= n; i++){
scanf("%d%d", &p[i], &d[i]);
} memset(dp, -, sizeof(dp));
memset(path, , sizeof(path));
dp[][ * m] = ;
for(int j = ; j < m; j++){//j表示选出的人的数目
for(int k = ; k <= m * ; k++){
if(dp[j][k] >= ){//方案(j,k)可行
for(int i = ; i <= n; i++){//找i是否出现过并且是否值得更新
int t1, t2;
if(dp[j][k] + p[i] + d[i] > dp[j + ][k + p[i] - d[i]]){
t1 = j; t2 = k;
while(path[t1][t2] != i && t1 > ){
t2 -= p[path[t1][t2]] - d[path[t1][t2]];
t1--;
}
if(t1 == ){
dp[j + ][k + p[i] - d[i]] = dp[j][k] + p[i] + d[i];
path[j + ][k + p[i] - d[i]] = i;
}
}
}
}
}
} int x = m * , y = ;
while(dp[m][x + y] < && dp[m][x - y] < )y++;
int k;
if(dp[m][x + y] > dp[m][x - y]){
k = x + y;
}
else{
k = x - y;
} printf("Jury #%d\n",cas++);
printf("Best jury has value %d for prosecution and value %d for defence:\n",(k-m*+dp[m][k])/,(dp[m][k]-k+m*)/);
for(int i=;i<=m;i++)
{
ans[i]=path[m-i+][k];
k-=p[ans[i]]-d[ans[i]];
}
sort(ans + , ans + m + );
for(int i=;i<=m;i++)
printf(" %d",ans[i]);
printf("\n\n");
}
return ;
}
poj1015 Jury Compromise【背包】的更多相关文章
- poj1015 Jury Compromise[背包]
每一件物品有两个属性.朴素思想是把这两种属性都设计到状态里,但空间爆炸.又因为这两个属性相互间存在制约关系(差的绝对值最小),不妨把答案设计入状态中,设$f[i][j]$选$i$个人,两者之差$j$. ...
- 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$,最终要填满容积 ...
- [POJ1015]Jury Compromise
题目大意:要求你从n个人中选出m个,每个人有两个值p[i],D[i],要求选出的人p总和与D总和的差值最小.若有相同解,则输出p总+D总最大的方案. 动态规划. 一直在想到底是n枚举外面还是m放外面, ...
- poj 1015 Jury Compromise(背包变形dp)
In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting of ...
- 背包系列练习及总结(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(背包+方案输出)
\(Jury Compromise\) \(solution:\) 这道题很有意思,它的状态设得很...奇怪.但是它的数据范围实在是太暴露了.虽然当时还是想了好久好久,出题人设了几个限制(首先要两个的 ...
- HDU 1015 Jury Compromise 01背包
题目链接: http://poj.org/problem?id=1015 Jury Compromise Time Limit: 1000MSMemory Limit: 65536K 问题描述 In ...
- POJ 1015 Jury Compromise(双塔dp)
Jury Compromise Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33737 Accepted: 9109 ...
随机推荐
- iOS图片上传及处理
从摄像头或者是从相冊中读取图片.须要通过UIImagePickerController类来实现,在使用UIImagePickerController时,须要是实现以下两个协议 <UINaviga ...
- JS自定义去除字符串左右两边的指定字符
function ltrim(str,char){ var pos = str.indexOf(char); var sonstr = str.substr(pos+1); return sonstr ...
- django admin 或xadmin 错误 总结
django管理界面admin搜索报错:TypeError: Related Field got invalid lookup: icontains 报错 TypeError: Related Fie ...
- ASP.NET基础(一)
ExecuteNonQuery()的用法 下面我们将详细讲解如何在Page_Load()中对数据库的增加.删除.修改,最后我们再来总结一下ExecuteNonQuery(),ExecuteScalar ...
- poj3067 Japan(树状数组)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:id=3067">http://poj.org/problem? id=3067 Descri ...
- 转:PHP获取浏览器类型及版本号
function getBrowser(){ $agent=$_SERVER["HTTP_USER_AGENT"]; if(strpos($agent,'MSIE')!==fals ...
- 亿级日PV的魅族云同步的核心协议与架构实践(转)
云同步的业务场景 这是魅族云同步的演进,第一张是M8.M9,然后到后面的是MX系统,M9再往后发展,我们的界面可以看到基本上是没有什么变化的,但本质发生了很大的变化,我们经过了一些协议优化,发展到今天 ...
- HTTP Content-Disposition Explanation [ from MDN ]
在常规的HTTP应答中,Content-Disposition 消息头指示回复的内容该以何种形式展示,是以内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地. 在multipart ...
- python的zipfile实现文件目录解压缩
主要是 解决了压缩目录下 空文件夹 的压缩 和 解压缩问题 压缩文件夹的函数: # coding:utf- import os import zipfile def zipdir(dirToZip,s ...
- kettle的日志
http://blog.sina.com.cn/s/blog_76a8411a01010u2h.html