$POJ1015\ Jury\ Compromise\ Dp$/背包
$Sol$
这是一道具有多个“体积维度”的$0/1$背包问题。
把$N$个候选人看做$N$个物品,那么每个物品有如下三种体积:
1.“人数”,每个候选人的“人数”都是$1$,最终要填满容积为$M$的背包
2.“辩方得分”,$a[i]$
3.“反方得分”,$b[i]$
要求的是辩方总分$D$和控方总分$P$的差的绝对值$|D-P|$最小,如果选择方法不唯一,那么在从中选择$D+P$最大的方案
所以将$a[i]-b[i]$作为体积之一,将$a[i]+b[i]$作为该物品的价值
注意这里的$a[i]-b[i]$可能为负,所以统一加上$4000$
以考虑到第$i$个人为阶段,$f[j][k]$表示已经在前$i$个人中选择了$j$个人,此时两方的总分之差为$k$时,两方的总分最大值。
$f[j][k]=max(f[j][k],f[j-1][k-(a[i]-b[i])]+a[i]+b[i])$
由于还需要输出方案,所以再加一个数组$d[i][j][k]$表示$f[i][j][k]$的第$i$个候选人选没选,这样就记录了方案。
$Code$
#include<iostream>
#include<cstdio>
#include<cstring>
#define Rg register
#define il inline
#define mem(a,b) memset(a,b,sizeof(a));
#define go(i,a,b) for(Rg int i=a;i<=b;i++)
#define yes(i,a,b) for(Rg int i=a;i>=b;i--)
using namespace std;
il int read()
{
int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
int T,n,m,hhh=,t,ct,a[],b[],f[][],as[];
bool d[][][];
int main()
{
while()
{
n=read(),m=read();if(!n)break;
printf("Jury #%d\n",++T);
go(i,,n)a[i]=read(),b[i]=read();
mem(f,-);mem(d,);
f[][hhh]=;
go(i,,n)
yes(j,m,)
go(k,-,)
{
if(k-(a[i]-b[i])>=- && k-(a[i]-b[i])<= && f[j-][k-(a[i]-b[i])+hhh]+a[i]+b[i]>= && f[j][k+hhh]<f[j-][k-(a[i]-b[i])+hhh]+a[i]+b[i])
f[j][k+hhh]=f[j-][k-(a[i]-b[i])+hhh]+a[i]+b[i],d[i][j][k+hhh]=;
//if(f[j][k+hhh]>=0)cout<<"i:"<<i<<" j:"<<j<<" k:"<<k<<" f:"<<f[j][k+hhh]<<" d:"<<d[i][j][k+hhh]<<endl;
}
go(i,,)
{
if(f[m][hhh+i]>=){if(f[m][hhh+i]>f[m][hhh-i])t=i;else t=-i;break;}
else if(f[m][hhh-i]>=){t=-i;break;}
}
printf("Best jury has value %d for prosecution and value %d for defence:\n",(f[m][hhh+t]+t)/,(f[m][hhh+t]-t)/);
int nw=n;ct=m;
while(nw>)
{
int dd=d[nw][ct][t+hhh];
if(dd)as[ct]=nw,ct--,t-=(a[nw]-b[nw]);
nw--;
}
go(i,,m)printf(" %d",as[i]);printf("\n\n");
}
return ;
}
随机推荐
- 《C语言深度解剖》学习笔记之预处理
第3章 预处理 1.下面两行代码都是错的.因为注释先于预处理指令被处理,当这两行被展开成“//……”和“/*……*/”时,注释已处理完毕,所以出现错误 #define BSC // #define B ...
- python实现以立春为起点n为周期任意日期所在的日期区间
python实现以立春为起点n为周期任意日期所在的日期区间 需求 话不多说,直接上具体需求. ''' 以每年的立春作为起始点,每N天为一个单元,任给一个日期,返回该日期所在单元的起始和结束日期.例如: ...
- Java中Map/List/Set .
很实用,分享一下. 简单版本 复杂版本 参考: http://initbinder.com/articles/cheat-sheet-for-selecting-maplistset-in-java. ...
- laravel5.6 发送邮件附带邮件时,Unable to open file for reading,报错文件路径问题
https://stackoverflow.com/questions/48568739/unable-to-open-file-for-reading-swift-ioexception-in-la ...
- 在做微信分享到朋友圈时,手机扫码报config:invalid signature,分享后后正常的问题,是url问题
是按照以下步骤检查的 除了ACCESS_TOKEN没有缓存其他都可以 如果是invalid signature签名错误.建议按如下顺序检查: 1.确认签名算法正确,可用 http://mp.weixi ...
- H3C 星型以太网拓扑扩展
- 数据存储在哪里? Java是值传递还是引用传递?
寄存器 : 最快的存储区,位于处理器中,寄存器会按需求自行分配空间,java不能控制寄存器,所以在程序中感觉不到它的存在 栈(stack) : 位于RAM(内存)中,速度仅次于寄存器,存储对象的引用( ...
- HDU 2066最短路径Dijkstra、
思路:枚举所有起点城市然后比较每个起点所去喜欢城市的最小距离 #include<cstdio> #include<cmath> #include<cstring> ...
- H3C 配置RIP peer
- Python--day29--logging模块(日志模块)
重要程度六颗星,比如一个小窗口的广告如果因为你没有日志的问题导致点击量没有记录下来,几十分钟那就会损失几十万了,这责任谁负得起. 希望离开一个公司是因为有了更好的去处而不是因为各种各样的原因被开掉,那 ...