(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的更多相关文章

  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. HDU POJ 1015 Jury Compromise(陪审团的人选,DP)

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

  9. POJ 1015 Jury Compromise

    感觉此题略难...... 背包问题.据说有一种二维DP的写法是错的.亲测,背包做法无误. dp[i][j][k]表示前i个物品,选择j个,差值为k的情况下获得的最大总和 dp[i][j][k]=max ...

随机推荐

  1. [转载]python 爬虫总结

    1.基本抓取网页 get方法 import urllib2 url = "http://www.baidu.com" response = urllib2.urlopen(url) ...

  2. 继承自CCObject的对象成员变量出错或者为空的问题

    写了个类想让其作为某种数据集合,还可以自动销毁,所以就直接继承了最底层的CCObject,所以并不属于视图,也就不会被addChild到显示列表里,于是就造成了接下来遇到的一个情况:其所有的成员变量被 ...

  3. 解决load 函数无法赋予变量名的问题

    以前非常喜欢使用load函数,因为简单,而且存储相对较大的matrix.list文件更为方便.但是load函数有一个问题是在使用其过程中无法对其载入的data赋予变量名: # save data x ...

  4. Apache详细介绍 - [ Apache v2.4.10 for Windows ]

    详细介绍 - [ Apache v2.4.10 for Windows ] 下载:http://down.admin5.com/fuwuqi/Apache_Windows.html Apache是世界 ...

  5. relative与absolute的结合使用

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. Junit单元测试细节

    1.中心思想: 单元测试不是证明你对,而是证明你没错 2.基本注解应用 注解 使用环境 @Test 标志这个方法需要单元测试 @BeforeClass 在所有单元测试方法前执行 ps:需要是stati ...

  7. POJ 1043 What's In A Name?(唯一的最大匹配方法)

                                                            What's In A Name? Time Limit: 1000MS   Memor ...

  8. POJ-2528 Mayor's posters (线段树区间更新+离散化)

    题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ...

  9. 第二章 C语言编程实践

    上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...

  10. kuangbin_ShortPath J (POJ 1511)

    其实虽然一开始有被这个题的8000MS 和 256MB限制又被吓到 但是严格来说跟之前的POJ 3268是一样的做法只是数据大了点 但是问题就出在数据大了点上 其实严格来说也不大 1e6 数组加起来大 ...