(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. mysql中在表中insert数据时,有重复主键id时,变成update

    MySQL 自4.1版以后开始支持INSERT … ON DUPLICATE KEY UPDATE语法 例如:  id name sex age  1 kathy male 23  2 Javer f ...

  2. python发布文件(windows)

    怎样发布文件 首先发布本地文件有一个好的用处,就是省去了朋友同import的时候还要使用sys.path,省的自己出错 1.新建文件夹d:\ tool 在的d:\tool文件夹中建立login.py ...

  3. LK 光流法简介

    前言 若假定一个局部区域的像素运动是一致的,则可以用这个新的约束条件替代前文中提到的全局速度平滑约束条件.这种光流算法就叫做 LK 光流法. LK 光流法的推导 首先,需要推导出光流约束方程. 这一步 ...

  4. JS中onpropertychange和onchange事件区别小结

    当一个HTML元素的属性用js改变的时候,都能通过onpropertychange来捕获.例如一个文本text对象的value属性被页面的脚本修改的时候,onchange无法捕获到,而onproper ...

  5. 在centos使用rpm包的方式安装mysql,以及更改root密码

    在centos使用rpm包的方式安装mysql,对于centos官方实际推荐使用yum进行安装,下载安装的方式主要用于内网服务器不能连接外网yum源的情况. 下载包 首先根据centos版本在mysq ...

  6. UI学习笔记---第三天

    视图控制器 功能:视图大小变换 \布局视图\响应事件\检测处理内存警告\检测以及处理屏幕旋转\检测视图切换 MVC (model View controller) UIViewController是M ...

  7. 递归神经网络(RNN,Recurrent Neural Networks)和反向传播的指南 A guide to recurrent neural networks and backpropagation(转载)

    摘要 这篇文章提供了一个关于递归神经网络中某些概念的指南.与前馈网络不同,RNN可能非常敏感,并且适合于过去的输入(be adapted to past inputs).反向传播学习(backprop ...

  8. abbyy cup a

    link: http://codeforces.com/contest/331/problem/A2 /* ID: zypz4571 LANG: C++ TASK: abby_a.cpp */ #in ...

  9. Kali安装

    Kali Linux 前身是 BackTrack ,不过Kali Linux是基于Debian 的 Linux 发行版,而BackTrack 则是基于Uubntu的,现在BackTrack 已经不更新 ...

  10. click 绑定(三)防止事件冒泡

     防止事件冒泡 默认情况下,Knockout允许click事件继续在更高一层的事件句柄上冒泡执行.例如,如果你的元素和父元素都绑定了click事件,那当你点击该元素的时候两个事件都会触发的.如果需要, ...