poj 1015 Jury Compromise(背包+方案输出)
$ Jury Compromise $
$ solution: $
这道题很有意思,它的状态设得很...奇怪。但是它的数据范围实在是太暴露了。虽然当时还是想了好久好久。首先出题人设了几个限制(两个的总和差值最小)(然后需要让它的总和最大)。我们发现每一个人的顺序是无关紧要的,这其实又提示了我们可以背包。但我们发现很难设状态,我们需要让我们的总差值接近0,但是我们在加人的时候我们的总差值可能会增大也可能会减小,导致后效性的产生,所以我们不能将总差值设为我们背包的权值。于是一个奇妙的想法产生了,我们将这个总差值直接设为状态,而将两者的总和作为权值。这样我们的权值在加入人之后必然增加,没有后效性。
然后就是记录方案了,这个大多数书上都有再设立一个数组记录转移路径的方法。但是这样的题博主推销用有向图存方案(好吧,碍于知识产权,这里留一下创立者:winlere),我们对于每一次更新都新建一个当前状态的子节点,然后连向转来的状态。这样很清晰明了,路径不易被覆盖。(具体详见代码)
$ code: $
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int
using namespace std;
int t,tt,n,m,ans,a1,a2;
int a[205];
int b[205];
int f[23][1005];
struct su{
int da,to;
}s[5000005];
int tou[23][1005];
inline int qr(){
register char ch; register bool sign=0; rg res=0;
while(!isdigit(ch=getchar())) if(ch=='-')sign=1;
while(isdigit(ch)) res=res*10+(ch^48),ch=getchar();
return sign?-res:res;
}
inline void print(int i){
if(i)print(s[i].to),printf(" %d",s[i].da);
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
while((n=qr())&&(m=qr())){ ++t; tt=0;
for(rg i=1;i<=n;++i)
a[i]=qr(),b[i]=qr();
for(rg i=0;i<=20;++i)
for(rg j=0;j<=800;++j)
f[i][j]=-1e9,tou[i][j]=0;
f[0][400]=0;
for(rg k=1;k<=n;++k){
rg x=a[k]-b[k],y=a[k]+b[k];
for(rg i=m-1;i>=0;--i)
for(rg j=1;j<=800;++j)
if(f[i][j]>=0&&f[i][j]+y>f[i+1][j+x]){
f[i+1][j+x]=f[i][j]+y;
s[++tt].da=k; s[tt].to=tou[i][j];
tou[i+1][j+x]=tt;
}
}
for(rg i=0;i<=400;++i)
if(f[m][400+i]>=0||f[m][400-i]>=0)
{ans=f[m][400+i]>f[m][400-i]?i:-i;break;}
a1=(f[m][400+ans]+ans)>>1; a2=f[m][400+ans]-a1;
printf("Jury #%d \nBest jury has value %d for prosecution and value %d for defence:\n",t,a1,a2);
print(tou[m][400+ans]); puts(""); puts("");
}
return 0;
}
poj 1015 Jury Compromise(背包+方案输出)的更多相关文章
- 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 ...
- OpenJudge 2979 陪审团的人选 / Poj 1015 Jury Compromise
1.链接地址: http://bailian.openjudge.cn/practice/2979 http://poj.org/problem?id=1015 2.题目: 总Time Limit: ...
- POJ 1015 Jury Compromise(双塔dp)
Jury Compromise Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33737 Accepted: 9109 ...
- POJ 1015 Jury Compromise 2个月后重做,其实这是背包题目
http://poj.org/problem?id=1015 题目大意:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n个人作为陪审团的候选人,然后再从 ...
- [Poj 1015] Jury Compromise 解题报告 (完全背包)
题目链接:http://poj.org/problem?id=1015 题目: 题解: 我们考虑设计DP状态(因为这很显然是一个完全背包问题不是吗?) dp[j][k]表示在外层循环到i时,选了j个人 ...
- POJ 1015 Jury Compromise dp分组
第一次做dp分组的问题,百度的~~ http://poj.org/problem?id=1015 题目大意:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑 ...
- POJ 1015 Jury Compromise(dp坑)
提议:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m人组成陪审团.选m人的办法是:控方和辩方会根据对候选 ...
- POJ 1015 Jury Compromise dp
大致题意: 从n个候选人中选出m个人作为陪审团.为了让陪审团的选择更公平,辩方和控方都为这n个候选人给出了满意度(辩方为D[j],控方为P[j],范围0至20).现在要使得选出的m位候选人的辩方总和与 ...
随机推荐
- NOIP一系列模拟赛小结
NOIP越发接近了,于是自己也跟着机房的几位师兄一起做了几次NOIP模拟赛,收获颇多. #1-T1:求点集中的点能否只用三条与坐标轴平行的直线就能全部被经过,其实只要将横纵坐标排序后逐个点检查下就行. ...
- BZOJ 3143 [Hnoi2013]游走 ——概率DP
概率DP+高斯消元 与博物馆一题不同的是,最终的状态是有一定的概率到达的,但是由于不能从最终状态中出来,所以最后要把最终状态的概率置为0. 一条边$(x,y)$经过的概率是x点的概率$*x$到$y$的 ...
- SPOJ CIRU The area of the union of circles ——Simpson积分
[题目分析] 圆的面积并. 直接Simpson积分,(但是有计算几何的解法,留着flag). simpson积分,如果圆出现了不连续的情况,是很容易出事情的.(脑补一下) 但是没有什么办法,本来就是一 ...
- [POJ2778]DNA Sequence(AC自动机 + DP + 矩阵优化)
传送门 AC自动机加DP就不说了 注意到 m <= 10,所以模式串很少. 而 n 很大就需要 log 的算法,很容易想到矩阵. 但是该怎么构建? 还是矩阵 A(i,j) = ∑A(i,k) * ...
- OS X 下iso刻录U盘(系统安装启动盘)
1. 查看盘 $diskutil list /dev/disk0 #: TYPE NAME SIZE IDENTIFIER : GUID_partition_scheme *320.1 GB disk ...
- 【CCF】行车路线 改编Dijkstra
[AC] #include<iostream> #include<cstdio> #include<string> #include<cstring> ...
- 2017NOIP初赛游记
前天晚上,玩三国杀,玩到了昨天凌晨2点40多分吧,我觉得初赛要爆炸了, 不得不吐槽一下,三国杀的武将太少了. 昨天是初赛的日子,上午8点多来了后看了看阅读程序和程序填空,复习了以下理论知识和wsj 然 ...
- Spell Boost
Spell Boost 时间限制: 1 Sec 内存限制: 128 MB 题目描述 Shadowverse is a funny card game. One day you are playing ...
- N皇后-位运算优化
N皇后问题 时间限制: 5 Sec 内存限制: 128 MB 题目描述 魔法世界历史上曾经出现过一个伟大的罗马共和时期,出于权力平衡的目的,当时的政治理论家波利比奥斯指出:“事涉每个人的权利,绝不应 ...
- Gdb学习笔记1
其实,从很早就开始接触gdb程序,gdb调试程序伴我成长,现在对其用法记录以下: 当程序的运行结果和预期结果不一致,或者程序出现运行错误时,gdb就可以派上大用处了.调试的基本过程是: -> ...