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 learning, so I took this link as reference:
http://blog.csdn.net/lyy289065406/article/details/6671105
1. It is a little tricky to pick dependent values for this DP. Again, just think about how you are going to expand this reel gradually. We pick number of chosen persons and min|D-P|
2. Back-tracing is used to trace paths.
3. Take care of details.
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <algorithm> #define MAX_NUM 400
#define MAX_CNT 20 // info per candidate
int pdiff[MAX_CNT + ];
int psum[MAX_CNT + ];
int rpath[MAX_CNT]; // runtime
int dp[MAX_CNT + ][MAX_NUM * + ]; // with offset
int path[MAX_CNT + ][MAX_NUM * + ]; // with offset void Reset()
{
memset( dp, -, sizeof(int) * ((MAX_NUM * + ) * (MAX_CNT + )));
memset(path, -, sizeof(int) * ((MAX_NUM * + ) * (MAX_CNT + )));
memset(rpath, -, sizeof(int) * MAX_CNT);
} // Backtrace: is i selected in dp[p][k]?
bool select(int i, int p, int k)
{
while (p > && path[p][k] != i)
{
k -= pdiff[path[p][k]];
p--;
}
return p ? true : false;
} void best_jury(int n, int m, int cnt, int *pd, int *ps)
{
Reset(); int fix = m * ;
dp[][fix] = ; for (int p = ; p <= m; p ++) // each selected m of dp
for (int k = ; k <= fix * ; k ++) // each hit sum(v) of dp
{
if (dp[p-][k] < ) continue; for (int i = ; i < n; i ++) // each one
{
// Remember: value of dp[][] is sum(sum)
int newk = dp[p - ][k] + psum[i];
if (newk > dp[p][k + pdiff[i]])
{
if (!select(i, p - , k))
{
// Remember:
// p -> candicate index
// k.. -> current sum(diff)
dp[p][k + pdiff[i]] = newk;
path[p][k + pdiff[i]] = i;
// printf("- put %d @ %d, %ds\n", i, p, k + pdiff[i]);
}
}
}
} // Get min sum(diff)
int k = -;
for (int i = ; i < fix; i++)
{
int v0 = dp[m][fix - i];
int v1 = dp[m][fix + i];
if (v0 > || v1 > )
{
k = i;
break;
}
} int minSumDiff = dp[m][fix - k] > dp[m][fix + k] ? (fix - k) : (fix + k); // pick the bigger sum one int ttlDiff = (dp[m][minSumDiff] + minSumDiff - fix) / ;
int ttlSum = (dp[m][minSumDiff] - minSumDiff + fix) / ; //
printf("Jury #%d\n", cnt);
printf("Best jury has value %d for prosecution and value %d for defence:\n", ttlDiff, ttlSum); // Output selected in order
int tmpk = minSumDiff;
int id_inx = ;
while (m > && path[m][tmpk] >= )
{
rpath[id_inx++] = path[m][tmpk];
tmpk -= pdiff[path[m][tmpk]];
m--;
}
std::sort(rpath, rpath + id_inx);
for (int i = ; i < id_inx; i ++)
{
printf(" %d", rpath[i] + ); // real inx starting from 1
}
printf("\n\n");
} int main()
{
int m, n, cnt = ;
int pi[MAX_NUM];
int di[MAX_NUM]; while ( scanf("%d", &n), scanf("%d", &m), cnt ++,
(m != ) && (n != ) )
{
// Get Input
for (int i = ; i < n; i ++)
{
scanf("%d%d", pi + i, di + i);
pdiff[i] = pi[i] - di[i];
psum[i] = pi[i] + di[i];
} //
Reset();
best_jury(n, m, cnt, pdiff, psum);
} return ;
}
POJ #1015 - Jury Compromise - TODO: POJ website issue的更多相关文章
- 背包系列练习及总结(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(背包+方案输出)
\(Jury Compromise\) \(solution:\) 这道题很有意思,它的状态设得很...奇怪.但是它的数据范围实在是太暴露了.虽然当时还是想了好久好久,出题人设了几个限制(首先要两个的 ...
- POJ 1015 Jury Compromise 2个月后重做,其实这是背包题目
http://poj.org/problem?id=1015 题目大意:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n个人作为陪审团的候选人,然后再从 ...
- POJ 1015 Jury Compromise dp分组
第一次做dp分组的问题,百度的~~ http://poj.org/problem?id=1015 题目大意:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑 ...
- [Poj 1015] Jury Compromise 解题报告 (完全背包)
题目链接:http://poj.org/problem?id=1015 题目: 题解: 我们考虑设计DP状态(因为这很显然是一个完全背包问题不是吗?) dp[j][k]表示在外层循环到i时,选了j个人 ...
- HDU POJ 1015 Jury Compromise(陪审团的人选,DP)
题意: 在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m人组成陪审团.选m人的办法是:控方和辩方会根据对候 ...
- POJ 1015 Jury Compromise
感觉此题略难...... 背包问题.据说有一种二维DP的写法是错的.亲测,背包做法无误. dp[i][j][k]表示前i个物品,选择j个,差值为k的情况下获得的最大总和 dp[i][j][k]=max ...
随机推荐
- Hex Editor实现Notepad++16进制编辑功能
把HexEditor.dll文件复制到安装目录(如C:\Program Files\Notepad++\plugins),退出NotePad++重新打开即可!需要以十六进制显示时,点击菜单的:[插件] ...
- HTTP 简介
HTTP 简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传 ...
- HDFS简介【全面讲解】
http://www.cnblogs.com/chinacloud/archive/2010/12/03/1895369.html [一]HDFS简介HDFS的基本概念1.1.数据块(block)HD ...
- ResponsiveSlides.js最轻量级的幻灯片插件
摘要:ResponsiveSlides.js是一个展示同一容器内图片的轻量级响应式jQuery幻灯片插件它支持包括IE6在内的几乎所有的浏览器,在IE6中还支持最大宽度属性,但在其它浏览器中并不原生支 ...
- ZOJ 1115 Digital Roots
原题链接 题目大意:给一个数字,每一位相加求和,不断重复过程,直到剩一位数字. 解法:考虑到输入的数字可以很大,把输入按照字符串格式读入,再逐位处理. 参考代码: #include <iostr ...
- iframe session过期跳转到登陆页面
在login.jsp中添加js: if(window !=top){ top.location.href=location.href; } <script type="text/jav ...
- alias sample method——运行时间复杂度为O(1)的抽样算法
根据离散离散概率分布抽样是一个常见的问题.这篇文章将介绍运行时间复杂度为O(1)的 alias method 抽样算法思想. 下面举例说明: 比如 a,b,c,d 的概率分别为 0.1,0.2,0.3 ...
- Codeforces Round #137 (Div. 2)
A. Shooshuns and Sequence 显然\([k,n]\)之间所有数均要相同,为了求最少步数,即最多模拟\(n\)次操作即可. B. Cosmic Tables 映射\(x_i,y_i ...
- 越狱Season 1-Episode 8: The Old Head
Season 1, Episode 8: The Old Head -Michael: 17 days from now they strap my brother to an electric ch ...
- CSS3教程:pointer-events属性值详解 阻止穿透点击
转:http://www.poluoluo.com/jzxy/201109/142876.html 在某个项目中,很多元素需要定位在一个地图层上面,这里就要用到很多绝对定位或者相对定位的元素,但是这样 ...