POJ1015

问题重述:

在n个候选者中选取m个人进入陪审团。每个候选者获得两项评分:D[j],P[j]。求解最佳评审团,使得在每个成员的两项评分和之差 最小的情况下,使得两项评分和之和 最大。

分析:

欲采用动态规划求解,必须先找到最优子结构。假如考虑评分差的绝对值,它的子问题并不一定是最优解。若考虑一定评分差下的评分和最大值,则拥有最优子结构。

用dp[i][j]表示在第i个评委评分后,评分差是j的最大评分和,得到递归公式:

dp[i][j] = max{ dp[ i - 1 ][ j - (D[i] - P[j]) ] + D[i] + P[j], dp[ i - 1 ][j] }

AC代码

 //Memory: 380K        Time: 79MS
 #include <iostream>
 #include <cstring>
 #include <cstdio>
 #include <algorithm>

 using namespace std;

 ][];
 ][];
 int n, m;
 ], d[];
 ;
 ];

 bool findPath(int n, int s, int target)
 {
     ) return false;
     if (target == prior[n][s + offset]) return true;
     int p = prior[n][s + offset];
     , s - (d[p] - q[p]), target);
 }

 void output(int ans)
 {
     ; j--) {
         r[j - ] = prior[j][ans + offset];
         int p = prior[j][ans + offset];
         ans -= (d[p] - q[p]);
     }
     sort(r, r + m);
     ; i < m; i++)
         cout << " " << r[i];
     cout << endl << endl;
 }

 int main()
 {
     ;
     while ( cin >> n >> m && n ) {
         ; i <= n; i++)
             cin >> d[i] >> q[i];
         memset(dp, -, sizeof(dp));
         memset(prior, , sizeof(prior));
         dp[][offset] = ;

         ; i <= m; i++) {
             ; j <= n; j++) {
                 int ss = d[j] + q[j];
                 int dd = d[j] - q[j];
                 ; s <= ; s++) {
                      || s - dd > ) continue;
                     ][s - dd + offset] != - && dp[i - ][s - dd + offset] + ss > dp[i][s + offset] && !findPath(i - , s - dd, j)) {
                         dp[i][s + offset] = dp[i - ][s - dd + offset] + ss;
                         prior[i][s + offset] = j;
                     }
                 }
             }
         }
         ; i <= ; i++) {
              && dp[m][offset - i] == -) continue;

             int ans = dp[m][offset + i] > dp[m][offset - i] ? i : -i;

             ;
             ;

             cout << "Jury #" << cas++ << endl;
             cout << "Best jury has value " << sd << " for prosecution and value "
                 << sq << " for defence:" << endl;
             output(ans);
             break;
         }
     }
     ;
 }

POJ1015 动态规划的更多相关文章

  1. [POJ1015]Jury Compromise

    题目大意:要求你从n个人中选出m个,每个人有两个值p[i],D[i],要求选出的人p总和与D总和的差值最小.若有相同解,则输出p总+D总最大的方案. 动态规划. 一直在想到底是n枚举外面还是m放外面, ...

  2. 增强学习(三)----- MDP的动态规划解法

    上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...

  3. 简单动态规划-LeetCode198

    题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...

  4. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

  5. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  6. C#动态规划查找两个字符串最大子串

     //动态规划查找两个字符串最大子串         public static string lcs(string word1, string word2)         {            ...

  7. C#递归、动态规划计算斐波那契数列

    //递归         public static long recurFib(int num)         {             if (num < 2)              ...

  8. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  9. 【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划

    [BZOJ1700][Usaco2007 Jan]Problem Solving 解题 Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地 ...

随机推荐

  1. HTML&CSS基础学习笔记1.3-HTML的标签语法

    HTML标签语法 1. 标签由英文尖括号<和>括起来,如<html>就是一个标签. 2. HTML中的标签一般都是成对出现的,分开始标签和结束标签.结束标签比开始标签多了一个/ ...

  2. Android高清巨图加载方案

    1.今天看了鸿洋的<Android高清巨图加载方案>一文,对加载高清巨图时的解决方案有了一定的认识. 思路为: 提供一个设置图片的入口. 重写onTouchEvent,在里面根据用户移动的 ...

  3. commons-logging log4j的联系区别

    1.Apache通用日志接口(commons-logging.jar)介绍 Apache Commons包中的一个,包含了日志功能,必须使用的jar包.这个包本身包含了一个Simple Logger, ...

  4. Hunt the Wumpus第二个版本---多怪兽,多洞穴,洞穴间双向互通

    其中,将洞穴连起来的算法要好好体会. 学习构建临时变量列表,确认循环用FOR,非确定循环用 WHILE,并定好退出条件. from random import choice cave_numbers ...

  5. 将rcc.exe添加到系统Path

    rcc不是内部或外部命令搜索下rcc.exe二进制文件的位置,然后将该路径添加到path环境变量中. 在cmd中输入path,显示当前的环境变量. 然后path = %path%;C:\Qt\4.8. ...

  6. Ruby的语法糖

    发现Ruby的语法糖好多,比如函数调用,参数列表可以写括号和不写括号.代码块可以用do end 或者 {}.   还有 if,unless后置.等等. 如果看Ruby代码看多了,你会发现,它很多地方的 ...

  7. auto space advisor

    <pre name="code" class="sql">首先:oracle有自动Job,进行shrink space SQL> select ...

  8. jquery图片3D旋绕效果 rotate3Di的操作

    这是一个图片效果,很简单实用,只需要一个"rotate3Di.js"的插件就行, 关于rotate的用法有如下几种: $(选择器).rotate3Di(30); //把图片3D旋转 ...

  9. day52

    今天依旧 阅读2篇的整理 数学试卷一套 综合练习计算 政治视频一个 范帅长难句一个 翻译两句 作文大小各一个 linux基础 今天折腾最久的应该是linux了 自己重新手动安装了一下 遇到的不少问题在 ...

  10. 查看syslog-ng内存,兼容容器情况

    syslog_pid=`ps -ef|grep syslog-ng|grep -v grep |awk '{print $2}'` pid_count=`ps -ef|grep syslog-ng|g ...