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 ...
随机推荐
- java CAS
在Doug Lea提供的cucurenct包 (J.U.C)中,CAS理论是实现整个java包的基石. Compare and Swap 在这里,CAS 指的是现代 CPU 广泛支持的一种对内存中 ...
- hdu 2335 Containers
水题,就不解释了,不过这个题有一点很好,就是枚举的时候,枚举宽,也就是列数,因为这样才能越来越接近正方形 #include<cstdio> #include<cstring> ...
- 7-zip的压缩的时候排除某目录
安装暂且不说了. 看一下帮助. [root@localhost Server]# 7z -Zip [] - Igor Pavlov -- p7zip Version ,Utf16=on,HugeFil ...
- Linux下解决“shutdown: command not found"问题
今天关机时,使用shutdown来执行此操作,但出现了一个"bash:shutdown:command not found"错误提示.这让我很困惑,这个命令在系统中是肯定存在的,但 ...
- 记录几种有关libsvm格式数据的list和dict用法
# list元素求和 sum = reduce(lambda x,y: x+y, mylist) # 比较两个 lists 的元素是否完全一致 if all(x==y for x, y in zip( ...
- input type=file
(1)首先来说一下,如何让 <input type='file' >成为你想要的模样. 最简单的方法就是在让<input type='file' >的透明度为0(完全透明),然 ...
- leetcode 134. Gas Station ----- java
There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...
- Jquery实现图片的预加载与延时加载
有很多项目经常会需要判断图片加载完成后执行相应的操作,或者需要图片延迟加载,网上虽然已经有很不错的插件,但要为这些效果还得单独加载一个插件的话总感觉有点不舒服,干脆自己写了个方法: 1 2 3 4 5 ...
- linux中的find命令——查找文件名
1.在某目录下查找名为“elm.cc”的文件 find /home/lijiajia/ -name elm.cc 2.查找文件名中包含某字符(如"elm")的文件 find /ho ...
- php(验证网址是否存在)错误
$ra=get_headers('http://hi.baidu.com'); if($ra[0]==='HTTP/1.1 200 OK'){ echo 'ok'; } 这是错误的,因为有时会返回 ...