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 ...
随机推荐
- Tomcat中负载的Session解决办法
Tomcat进行请求的Session解决方式总体来说有三种, (1)使用Nginx或者Apache反向代理工具进行用户请求的分机器,在Tomcat的Engine中的标签中加入jvmRoute属性,指定 ...
- OpenFlow Switch学习笔记(四)——Matching
这次我们着重详述来自于网络中的数据包在OpenFlow Switch中与Flow Entries的具体匹配过程,以及当出现Table Miss时的处理方式,下面就将从这两方面说起. 1.Matchin ...
- scrollView滚动(通过代码)
平时的开发中可能会要求scrollview滚动,一般的方法时通过scrollview.scrollto(0,1000);来实现,但是注意这个方法是在scrollview停止动画之后才能执行的,因为如果 ...
- POJ 1502 MPI Maelstrom
MPI Maelstrom Time Limit : 2000/1000ms (Java/Other) Memory Limit : 20000/10000K (Java/Other) Total ...
- ZOJ 1090 The Circumference of the Circle
原题链接 题目大意:已知三角形的三个顶点坐标,求其外接圆的周长. 解法:刚看到这道题时,马上拿出草稿纸画图,想推导出重心坐标,然后求出半径,再求周长.可是这个过程太复杂了,写到一半就没有兴致了,还是求 ...
- JS控制文本框textarea输入字数限制
<html> <head> <title>JS限制Textarea文本域字符个数</title> <meta http-equiv="C ...
- uva562 Dividing coins 01背包
link:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- JS初学之-选项卡(常见)
思路:鼠标滑过的效果直接用a:hover实现的,比较简便,缺点是在IE下不兼容. 为每一个Li添加点击事件,将每一个li用自定义属性的方法与div相匹配,重点是在点击事件内,要先遍历每一个div, ...
- Oracle学习系列2
SQL语法练习: 1,选择部门30中的所有员工 select * from emp where deptno=30; 2,列出办事员的姓名,编号和部门编号 select ename, empno, d ...
- Qt GUI@学习日志
day 1: Qt中类: 理解一个类最好还是从其类代码实现上看. 由此图可看出需要好好研究那几个重要的类:Qt/QEvent/QObject/QWidget/. QApplication: (比较复杂 ...