题解:POJ1015 Jury Compromise 【DP】

传送门

描述
在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定。陪审团是由法官从公众中挑选的。先随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m人组成陪审团。选m人的办法是:
控方和辩方会根据对候选人的喜欢程度,给所有候选人打分,分值从0到20。为了公平起见,法官选出陪审团的原则是:选出的m个人,必须满足辩方总分和控方总分的差的绝对值最小。如果有多种选择方案的辩方总分和控方总分的之差的绝对值相同,那么选辩控双方总分之和最大的方案即可。
输入
输入包含多组数据。每组数据的第一行是两个整数n和m,n是候选人数目,m是陪审团人数。注意,1<=n<=200, 1<=m<=20 而且 m<=n。接下来的n行,每行表示一个候选人的信息,它包含2个整数,先后是控方和辩方对该候选人的打分。候选人按出现的先后从1开始编号。两组有效数据之间以空行分隔。最后一组数据n=m=0
输出
对每组数据,先输出一行,表示答案所属的组号,如 ‘Jury #1’, ‘Jury #2’, 等。接下来的一行要象例子那样输出陪审团的控方总分和辩方总分。再下来一行要以升序输出陪审团里每个成员的编号,两个成员编号之间用空格分隔。每组输出数据须以一个空行结束。

这个题目是取一组数,使在 |P-D| 最小的情况下使 D+P 最大,这个带绝对值使没有最优子结构的,所以只能考虑枚举,这种做法有点想(luogu P1282 多米诺骨牌
用 f [ j , k ] 表示选取了j个人,差为k的最大和

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define re register
#define gc getchar()
#define ll long long
inline int read() {
	re int x(0),f(1);re char ch(gc);
	while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=gc;}
	while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=gc;
	return x*f ;
}
const int N=222;
int n,m,p[N],d[N];
int f[22][880],P[22][880],ans[22];

int main() {
	
	freopen("y.txt","r",stdin);
	while(1) {
		n=read(),m=read();
		if(n==0||m==0) return 0;
		for(int i=1;i<=n;++i) 
			p[i]=read(),d[i]=read();
		memset(f,-1,sizeof(f));
		memset(P,0,sizeof(P));
		int _max=m*20;
		f[0][_max]=0;
		for(int j=0;j<m;++j) {
			for(int k=0;k<=_max*2;++k) 
				if(f[j][k]>=0){
					for(int i=1;i<=n;++i) {
						if(f[j][k]+p[i]+d[i]>f[j+1][k+p[i]-d[i]]) {
							int t1=j,t2=k;
							while(t1>0&&P[t1][t2]!=i) {
								t2-=p[P[t1][t2]]-d[P[t1][t2]];	
								t1--;
							}
							if(t1==0) {	
								f[j+1][k+p[i]-d[i]]=f[j][k]+p[i]+d[i];
								P[j+1][k+p[i]-d[i]]=i;
							}
						}
					}
				}
			}
		int k=0,t;
		while(f[m][_max+k]<0&&f[m][_max-k]<0)
			++k;
		if(f[m][k+_max]>f[m][_max-k])
			t=_max+k;
		else 
			t=_max-k;
		for(int i=1;i<=m;++i) {
			ans[i]=P[m-i+1][t];
			t-=p[ans[i]]-d[ans[i]];	
		}
		sort(ans+1,ans+1+m);	
		for(int i=1;i<=m;++i)
			cout<<ans[i]<<" ";
		cout<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43464026/article/details/88237143