$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 ;
}
随机推荐
- TensorFlow的 卷积层
用 TensorFlow 做卷积 让我们用所学知识在 TensorFlow 里构建真的 CNNs.在下面的练习中,你需要设定卷积核滤波器(filters)的维度,weight,bias.这在很大程度上 ...
- Libev源码分析08:Libev中的信号监视器
Libev中的信号监视器,用于监控信号的发生,因信号是异步的,所以Libev的处理方式是尽量的将异步信号同步化.异步信号的同步化方法主要有:signalfd.eventfd.pipe.sigwaiti ...
- @codechef - MXMN@ Maximum and Minimum
目录 @description@ @solution@ @accepted code@ @details@ @description@ 定义函数 f(G, x, y) 为 G 中点 x 和点 y 之间 ...
- saltStack 配置管理(也就是替换文件)
目录 /srv/salt/base下面新建一个文件dns.sls /opt/resolv.conf_bak: #这个是文件替换的位置,也就说替换到远程文件的/opt/resolv.conf_ ...
- ubuntu18.04 挂载ntfs硬盘无法写入解决办法
win10和ubuntu18.04双系统,在ubuntu下通过/etc/fstab挂载ntfs硬盘无写入权限,尝试通过chmod修改写入权限和ntfs-config图形工具修改写入权限均失败.在ubu ...
- 使用国内阿里maven私服方法
方法1,在maven的config下setings.xml文件中加入以下代码 <mirrors> <mirror> <id>mirrorId</id> ...
- 深入java面向对象三:抽象类和接口(转载)
文章系转载,地址: http://blog.csdn.net/xw13106209/article/details/6923556 1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架 ...
- java构造方法的私有化
有的时候我们为了避免外界创建某类的实例,就将某类的构造方法私有化,即将它的构造方法用private修饰: 外界如何用到? 提供get方法!不提供的话外界就没法创建对象!(对反射无效) Eg:packa ...
- 本地安装配置redis
Windows中redis的下载及安装.设置 本文是转载自:https://www.cnblogs.com/jylee/p/9844965.html 下载地址: https://github.co ...
- [Atom 编辑器 ] Packages
Atom包 https://atom.io/packages 常用包整理: atom-chinese-menu 中文插件 atom-ternjs 对 es5,es6的语法支持 ato ...