POJ1015 Jury Compromise【背包问题】
题意:
选陪审团。n个候选人,选出m个人加入陪审团。辩方和控方会给n个人中的每一个人打分,分值0-20,辩方分值所加和为D,控方为P,要求 |D-P| 最小,如果方案不唯一,则选 D+P 最大的方案。
思路:
记 f[i][j] 为挑出 i 个人,分差为 j 时,总分值最大。
则 f[i][j] = max( f[i][j] , f[i-1][ j-a[k] ]+b[k] ),进行循环操作即可,详细见代码。
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define rep(i,a,b) for(int i=a;i <= b;i++)
#define per(i,a,b) for(int i=a;i >= b;i--)
using namespace std;int f[30][810],path[30][810],a[300],b[300]; //path[i][j]表示状态f[i][j]是选了哪个候选人而得到的
int n,m,now;inline bool find(int i,int j,int k)
{if(i==0) return false;if(path[i][j] == k) return true;return find(i-1,j-a[path[i][j]],k);
}int main()
{int cas(0);while(scanf("%d%d",&n,&m),n+m){memset(f,-1,sizeof f);rep(i,1,n){int x,y;scanf("%d%d",&x,&y);a[i] = x-y; //记录差值 b[i] = x+y; //记录总和 }now = m*20; //最大差值 以now为基准点,0点 f[0][now] = 0; //f的值 记录 D+P 的最大值rep(i,1,m)rep(j,0,2*now)if(~f[i-1][j]) //~-1 == 0 前i-1个人达不到差值为j,则不用再根据该点更改i的值 rep(k,1,n) //用f[i-1][j]对每一个点进行更改 if(!find(i-1,j,k)) //第k个选手不在f[i-1][j]的路径上 {if(f[i][j+a[k]] < f[i-1][j]+b[k]) //选 D+P 最大的 {f[i][j+a[k]] = f[i-1][j]+b[k];path[i][j+a[k]] = k;// cout<<path[i][j+a[k]]<<" i: "<<i<<" j+a[k]: "<<j+a[k]<<endl;}}int tmp = 0x7fffffff; //赋值的原因是第二个循环涉及tmp的比较,如果第一个循环没找到值的话,那么tmp非最大值,第二个循环就凉了 int ans;cout<<ans<<endl;rep(i,now,2*now){ //差值从-now~nowif(~f[m][i]){tmp = i-now;ans = f[m][i];break;}}per(i,now,0){if(~f[m][i]){if(now-i < tmp ||( (now-i) == tmp && f[m][i] > ans)){tmp = i-now;ans = f[m][i];break;}}}
// cout<<tmp<<endl;printf("Jury #%d\n",++cas);int x = (tmp+ans)>>1,y = ans-x;printf("Best jury has value %d for prosecution and value %d for defence: \n",x,y);int tot = 0;int q[30];x = m;y = tmp+now;while(x){q[++tot] = path[x][y];y -= a[path[x][y]];x--;}sort(q+1,q+tot+1);rep(i,1,m)printf(" %d",q[i]);puts("\n"); }return 0;
}
POJ1015 Jury Compromise【背包问题】相关推荐
- poj1015 Jury Compromise
dp题,类似于01背包的转移 需要注意的是:背包容量在有的时候可能为负数,所以需要算出最大数据量整体平移 像01背包一样直接倒序循环j并不能保证每一个物品只选一个,两个等价的物品在计算时可能会重复使用 ...
- Jury Compromise POJ - 1015
Jury Compromise POJ - 1015 题意: 在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n个人作为陪审团的候选人,然后再从这n个人中 ...
- POJ1015陪审团(Jury Compromise)——dp+路径记录
题目:http://poj.org/problem?id=1015 差值是有后效性的,所以"转化为可行性",开一维记录"能否达到这个差值". 当然可以开两维分别 ...
- POJ 1015 Jury Compromise dp分组
第一次做dp分组的问题,百度的~~ http://poj.org/problem?id=1015 题目大意:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑 ...
- kuangbin专题十二 基础DP
kuangbin专题十二 基础DP A - HDU1024 Max Sum Plus Plus B - HDU1029 Ignatius and the Princess IV C - HDU1069 ...
- OI每周刷题记录——lrllrl
看这标题就知道我是模仿的hzwer大佬,远程%%% 大佬的OI经历让蒟蒻我深受感触,为了晚一些AFO本蒟蒻也得加油了 从高二上期第一周开始计数,每个星期天更一次,一直更到我AFO 如果这是我此生最后一 ...
- 0x52. 动态规划 - 背包(习题详解 × 19)
目录 0x52. 动态规划 - 背包 0x52.1 0/10/10/1 背包 Problem A. 数字组合 Problem B. 背包问题求具体方案 Problem C. jury Compromi ...
- 动态规划总结与题目分类
源博客链接:http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少 ...
- 『ACM-算法-动态规划』初识DP动态规划算法
一.多阶段决策过程的最优化问题 在现实生活中,有类活 动的过程,由于 它的特殊性,可将过程分成若干个互相阶段.在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.当阶段决策的选取不是任意确 ...
- 神牛笔记:吉林大学ACM总结(fennec)
其实在北京比赛完的时候,我就想写了,不过还是早了点,直到上海比赛结束,大家的心中都不是太好受.郭老师有句话:你们这样做也是对的,不成功就成仁.让我的心也能安慰了不少. 我是从大一下学期开始接触ACM的 ...
最新文章
- 项目3:(4)点到直线的距离以及夹角
- 【CocoaPods】CocoaPods:Objective-C依赖库管理(XCode 4.6)
- 2021年春季学期-信号与系统-第十四次作业参考答案-第二小题参考答案
- mysql8.0.12插件_mysql 8.0.12 安装使用教程
- java juc包多线程编程案例:Executor入门示例
- kafka-manager 安装
- java图形用户登录界面_Java简单登录图形界面
- JAVA调用动态链接库
- 论剑乌镇:历届互联网大会热词盘点
- 对Windows学习的总结
- Linux里如何查找文件内容
- 刨根究底字符编码之八——Unicode编码方案概述
- PS改变图片颜色的方法
- ThreadLocal 简单了解
- 一文读懂供应链金融及其衍生产品
- 动态规划算法思想解决找零钱问题
- Android VideoView播放网络视频简介
- mysql+过滤纯标点符号,用正则表达式去除标点符号
- Robot Framework自动化测试解决selenium2library加载失败
- (附源码)springboot+mysql+基于web的在线问答社区系统设计与实现 毕业设计061628
热门文章
- 设计模式之Interpreter(解释器)
- Enterprise Manager 无法连接到数据库实例。下面列出了组件的状态。
- [ASM] 基础概念
- xsehll不能删除字符的解决方案
- 费马定理中值定理_长盛不衰的法国数学|费马
- 求一篇计算机word文档作业,计算机应用基础作业3:Word2003
- 讲python现状的文章_用 Python 分析 Python 工作现状
- 控制反转和依赖注入的理解(通俗易懂)_Spring 的本质系列之依赖注入_一点课堂(多岸学院)...
- ppt地图分布图一块一块的怎么做_没想到PPT还能这样做动态地图,实在是太炫酷了,用了再也离不开...
- STL容器 之 vector