感觉此题略难。。。。。。

背包问题。据说有一种二维DP的写法是错的。亲测,背包做法无误。

dp[i][j][k]表示前i个物品,选择j个,差值为k的情况下获得的最大总和

dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-1][k-差]+和) 即第i个物品用或者不用。

DP完成之后,在表中寻找一下最优解即可。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std; struct Path
{
// int a,b,c;
int w;
} path[+][+][+];
int dp[+][+][+];
int p[+],d[+];
int n,m;
stack<int>S;
int Z=; int main()
{
int Case=;
while(~scanf("%d%d",&n,&m))
{
if(!n&&!m) break; for(int i=; i<=n; i++) scanf("%d%d",&p[i],&d[i]);
memset(dp,-,sizeof dp);
dp[][][Z]=; for(int i=; i<=n; i++)
for(int j=; j<=m; j++)
for(int k=; k<=*Z; k++)
path[i][j][k].w=-; for(int i=; i<=n; i++)
{
for(int j=; j<=m; j++)
{
for(int k=Z*; k-(p[i]-d[i])>=; k--)
{
if(dp[i-][j][k]!=-)
{
dp[i][j][k]=dp[i-][j][k];
path[i][j][k].w=;
} if(j>=&&dp[i-][j-][k-(p[i]-d[i])]!=-)
{
if(dp[i-][j-][k-(p[i]-d[i])]+p[i]+d[i]>dp[i][j][k])
{
dp[i][j][k]=dp[i-][j-][k-(p[i]-d[i])]+p[i]+d[i];
path[i][j][k].w=;
}
}
}
}
} int posa,posb,posc;
int Max=-;
for(int i=; i<=Z; i++)
{
for(int j=; j<=n; j++)
if(dp[j][m][Z+i]>Max&&path[j][m][Z+i].w==)
Max=dp[j][m][Z+i],posa=j,posb=m,posc=Z+i;
for(int j=; j<=n; j++)
if(dp[j][m][Z-i]>Max&&path[j][m][Z-i].w==)
Max=dp[j][m][Z-i],posa=j,posb=m,posc=Z-i;
if(Max!=-) break;
} while(!S.empty()) S.pop(); int ans1,ans2;
ans1=(posc-Z+dp[posa][posb][posc])/;
ans2=ans1-(posc-Z); while()
{
if(path[posa][posb][posc].w==-) break;
if(path[posa][posb][posc].w!=-)
{
int Newa,Newb,Newc;
if(path[posa][posb][posc].w==)
{
S.push(posa);
Newa=posa-;
Newb=posb-;
Newc=posc-(p[posa]-d[posa]);
}
else
{
Newa=posa-;
Newb=posb;
Newc=posc;
}
posa=Newa;
posb=Newb;
posc=Newc;
}
} printf("Jury #%d\n",Case++);
printf("Best jury has value %d for prosecution and value %d for defence:\n",ans1,ans2);
while(!S.empty())
{
printf(" %d",S.top());
S.pop();
}
printf("\n\n"); }
return ;
}

POJ 1015 Jury Compromise的更多相关文章

  1. 背包系列练习及总结(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 ...

  2. OpenJudge 2979 陪审团的人选 / Poj 1015 Jury Compromise

    1.链接地址: http://bailian.openjudge.cn/practice/2979 http://poj.org/problem?id=1015 2.题目: 总Time Limit: ...

  3. POJ 1015 Jury Compromise(双塔dp)

    Jury Compromise Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33737   Accepted: 9109 ...

  4. poj 1015 Jury Compromise(背包+方案输出)

    \(Jury Compromise\) \(solution:\) 这道题很有意思,它的状态设得很...奇怪.但是它的数据范围实在是太暴露了.虽然当时还是想了好久好久,出题人设了几个限制(首先要两个的 ...

  5. POJ 1015 Jury Compromise 2个月后重做,其实这是背包题目

    http://poj.org/problem?id=1015 题目大意:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n个人作为陪审团的候选人,然后再从 ...

  6. POJ 1015 Jury Compromise dp分组

    第一次做dp分组的问题,百度的~~ http://poj.org/problem?id=1015 题目大意:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑 ...

  7. [Poj 1015] Jury Compromise 解题报告 (完全背包)

    题目链接:http://poj.org/problem?id=1015 题目: 题解: 我们考虑设计DP状态(因为这很显然是一个完全背包问题不是吗?) dp[j][k]表示在外层循环到i时,选了j个人 ...

  8. POJ #1015 - Jury Compromise - TODO: POJ website issue

    (poj.org issue. Not submitted yet) This is a 2D DP problem, very classic too. Since I'm just learnin ...

  9. HDU POJ 1015 Jury Compromise(陪审团的人选,DP)

    题意: 在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m人组成陪审团.选m人的办法是:控方和辩方会根据对候 ...

随机推荐

  1. Python 入门基础学习

     Python入门学习  我们使用python3.0版本 首选来入门  带你进入Hello World >>> print ("Hello World")Hell ...

  2. wpf之数据触发器DataTrigger

    wpf, 根据绑定的属性的值的不同(数据分类),界面上显示不同的控件(绑定不同类型的属性),可以使用数据库触发器DataTrigger实现这一功能. 实现的效果如下: 首先建立实体类: 更改通知类: ...

  3. 初次stack-overflow 提交答案

    初次在stack-overflow上面提交答案,首先编辑器非常好用,语法检查都有, 还有付费版的,更高级,更好用,nice. 付费版:https://www.grammarly.com/upgrade ...

  4. 怎样解决VS2013模块对于SAFESEH 映像是不安全的

    今天在使用VS2013编译一个控制台应用程序时出现了:error LNK2026 模块对于 SAFESEH 映像是不安全的,按照以下步骤轻松解决了. 打开该项目的“属性页”对话框,然后单击“链接器”- ...

  5. Android之SurfaceView学习(一)转转

    Android之SurfaceView学习(一) 首先我们先来看下官方API对SurfaceView的介绍 SurfaceView的API介绍 Provides a dedicated drawing ...

  6. codeforces 558/C Amr and Chemistry(数论+位运算)

    题目链接:http://codeforces.com/problemset/problem/558/C 题意:把n个数变成相同所需要走的最小的步数易得到结论,两个奇数不同,一直×2不可能有重叠枚举每个 ...

  7. ActiveMQ的配置与使用

    1.什么是ActiveMQ MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来 ...

  8. 转:透析QTP自动化测试框架SAFFRON

    1.为什么要使用框架? 框架是一组自动化测试的规范.测试脚本的基础代码,以及测试思想.惯例的集合.可用于减少冗余代码.提高代码生产率.提高代码重用性和可维护性.例如QTestWare就是QTP自动化测 ...

  9. Angularjs循环二维数组

    <div ng-app> <div ng-controller="test"> <div ng-repeat="links in slide ...

  10. php获取文件名

    php获取文件名$phpself =$_SERVER['PHP_SELF']; //获取当前文件名$str = end(explode("/",$phpself)); //去掉'/ ...