POJ1015
题目链接:http://poj.org/problem?id=1015
大概题意:
法庭要挑选m人陪审团。先随机挑选n个公民,对于每个公民,控辩双方都有各自的“喜好度”p[ ] 和 d[ ],法庭要尽量保证陪审团的m人中控方总喜好度和辩方总喜好度的差值的绝对值尽可能小,如果最佳的结果有多个,那么就选择控辩双方总喜好度最高的那个。
解题思路:
日常不会dp题,哭),。。。思路源于网络
设一个二维数组 dp[i][j], i代表“使用”了几个人,j代表控辩双方喜好度之差,为了避免出现数组下标为负的情况,我们可以把j值的最后再加上20*m。
状态转移方程:dp[ i+1 ][ j+dat[i+1] ] = min(dp[i+1][ j+dat[i+1] ] , dp[i][j]+sum[i+1] )。sum[i+1] = p[i+1] + d[i+1], dat[i+1] = p[i+1] - d[i+1] 。
用vector记录路径,操作方便的出奇。
Waring: 要把选取哪个人这个循环放在最外层,不然会出现这种bug: 比如说 dp[5][y] = {1,2,3,5,6} = {1,2,3,7,8}, sum[5] + sum[6] = sum[7] + sum[8], 此时程序就有可能选择前面那个{1,2,3,5,6}这五个人,但是sum[5] 很大(大于剩下的所有sum),到了 dp[6][x]的时候,由于第5人已经被选取了,所以他无法再选择第五人,但是如果当初选择的是sum[7]+sum[8],此时就可以选择sum[5]了,很明显,后者会更优,所以程序会出bug。
AC代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std; const int inf=0x7ffffff;
int dp[][];
pair<int,int> pd[];
vector<int> path[][];
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int n,m,a,b,cases=,min_n;
while(scanf("%d%d",&n,&m)==&&n&&m){
for(int i=;i<=n;i++)
scanf("%d%d",&pd[i].first,&pd[i].second);
min_n=*m;
for(int i=;i<=m;i++){
for(int j=;j<=*m;j++){
path[i][j].clear();
dp[i][j]=-inf;
}
}
dp[][min_n]=;
for(int k=;k<=n;k++){
int dat=pd[k].first-pd[k].second, sum=pd[k].first+pd[k].second;
for(int i=m-;i>=;i--){
for(int j=;j<=*m;j++){
if(dp[i][j]>=){
if(dp[i+][j+dat]<=dp[i][j]+sum){
dp[i+][j+dat]=dp[i][j]+sum;
path[i+][j+dat]=path[i][j];
path[i+][j+dat].push_back(k);
}
}
}
}
}
a=b=;
for(int i=;i<=*m;i++){
if(dp[m][min_n+i]>=||dp[m][min_n-i]>=){
int temp;
if(dp[m][min_n+i]>dp[m][min_n-i]) temp=min_n+i;
else temp=min_n-i;
for(int l=;l<m;l++){
int ind=path[m][temp][l];
a+=pd[ind].first,b+=pd[ind].second;
}
printf("Jury #%d\n",cases++);
printf("Best jury has value %d for prosecution and value %d for defence:\n",a,b);
for(int l=;l<m;l++) printf(" %d",path[m][temp][l]);
printf("\n\n");
break;
}
} }
return ;
}
POJ1015的更多相关文章
- [POJ1015]Jury Compromise
题目大意:要求你从n个人中选出m个,每个人有两个值p[i],D[i],要求选出的人p总和与D总和的差值最小.若有相同解,则输出p总+D总最大的方案. 动态规划. 一直在想到底是n枚举外面还是m放外面, ...
- 【poj1015】 Jury Compromise
http://poj.org/problem?id=1015 (题目链接) 题意 随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m 人组成陪审团.选m人的办法是:控方和辩方会根据对候选人的喜欢 ...
- POJ1015 动态规划
POJ1015 问题重述: 在n个候选者中选取m个人进入陪审团.每个候选者获得两项评分:D[j],P[j].求解最佳评审团,使得在每个成员的两项评分和之差 最小的情况下,使得两项评分和之和 最大. 分 ...
- POJ-1015(背包变形+输出路径)
Jury Compromise POJ-1015 推荐几个较好的介绍和理解:https://blog.csdn.net/lyy289065406/article/details/6671105 htt ...
- NOI题库1980 陪审团的人选(POJ1015)
1980:陪审团的人选 总时间限制: 1000ms 内存限制: 65536kB 描述 在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n个人作为陪审团的候 ...
- POJ1015 && UVA - 323 ~Jury Compromise(dp路径)
In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting of ...
- 【POJ1015】Jury compromise 多个费用的背包
这是一道比较综合的动态规划问题. 首先,根据题目中的从N个人中选出M个人,并且要使得某个目标函数最优,可以想到是背包问题,且因为要取出M个人,人数也应该作为背包体积的一个维度. 其次,要求输出路径,因 ...
- poj1015 01二维背包
/* 给定辩控双方给每个人的打分p[i],d[i], dp[j][k]表示前i个人有j个被选定,选定的人的辩控双方打分差之和是k,此状态下的最大辩控双方和 按01背包做,体积一维是1,体积二维是辩控双 ...
- poj-1015(状态转移的方向(01背包)和结果的输出)
#include <iostream> #include <algorithm> #include <cstring> #include <vector> ...
- POJ1015陪审团(Jury Compromise)——dp+路径记录
题目:http://poj.org/problem?id=1015 差值是有后效性的,所以“转化为可行性”,开一维记录“能否达到这个差值”. 当然可以开两维分别记录 a 和 b,但 “值只是0或1” ...
随机推荐
- [转]探索 Android 内存优化方法
前言 这篇文章的内容是我回顾和再学习 Android 内存优化的过程中整理出来的,整理的目的是让我自己对 Android 内存优化相关知识的认识更全面一些,分享的目的是希望大家也能从这些知识中得到一些 ...
- js 实现淘宝无缝轮播图效果,可更改配置参数 带完整版解析代码[slider.js]
前言: 本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽. 本篇文章为您分析一下原生JS写淘宝无缝轮播图效果 需求分析: ...
- c语言-----劫持系统03
1. 回顾 在前2节我们已经实现了劫持原理.函数指针等一些概念,下面进行系统劫持 2. 工具 vs2017 Detours 3. windows如何创建一个进程? (1)创建进程函数 CreatePr ...
- javascript SDK开发之webpack中eslint的配置
eslint的好处就不多说了.代码检查,代码报错, 智能提示,让开发人员更规范的撸代码等等. 1.安装依赖 npm install --save-dev eslint eslint-friendly- ...
- 乾颐堂7月HCIE、CCIE通过名单
拼多多都上市了,现在很多培训机构也流行公用一张PASS了,山寨总是山寨的,不脚踏实地总是欺骗自己7月(自然月)乾颐堂通过22名学员,每个考试日通过一名HCIE.CCIE 转载于:https://blo ...
- Java——Spring依赖配置详解
<properties> <junit.version>4.12</junit.version> <spring.version>4.3.9.RELEA ...
- 斜率dp A - Print Article HDU - 3507
A - Print Article HDU - 3507 今天刚刚学习了一下斜率dp,感觉还ok,主要就是要推这个斜率,然后利用数据结构来优化. 推荐两篇写的比较好的博客,https://www.cn ...
- E - No Pain No Game 线段树 离线处理 区间排序
E - No Pain No Game HDU - 4630 这个题目很好,以后可以再写写.这个题目就是线段树的离线写法,推荐一个博客:https://blog.csdn.net/u01003321 ...
- C. Coffee Break 贪心 思维 有点难 有意思
C. Coffee Break 这个贪心之前好像写过,还是感觉挺难的,有点不会写. 这个题目大意是:给你一个数列n个元素,然后给你一天的时间,给你一个间隔时间d, 问你最少要用多少天可以把这个数列的所 ...
- LTE网络概述
LTE主要由两部分组成:无线接入技术演进(E-UTRAN)+系统架构演进(SAE):其中,SAE主要含有的是演进型分组交换核心网(EPC),其控制处理部分为移动性管理实体(MME),数据承载部分称为业 ...