题目:http://poj.org/problem?id=1015

DP的第一维是选了几个人,第二维是当前D与P的差值,而值存的是当前D与P的和;

技巧1:通过平移避免负角标,即代码中的fix;

技巧2:做完DP后找出最小的差的绝对值时,如下的那一小段代码很有效率;

技巧3(*):记录路径——①更新路径时每次判断是否重复选了一个人,重复则不更新;

if(f[j][k]+P[i]+D[i]>f[j+1][k+P[i]-D[i]])
{t1=j;t2=k;while(t1>0&&Path[t1][t2]!=i)//验证i是否在前面出现过
    {t2-=P[Path[t1][t2]]-D[Path[t1][t2]];t1--;}if(t1==0){f[j+1][k+P[i]-D[i]]=f[j][k]+P[i]+D[i];Path[j+1][k+P[i]-D[i]]=i;}
} 

记录路径1(转)

        int tmp=mk;for(int j=m;j>0;j--){int pr=pre[j][tmp];ans[j]=pr;tmp-=(a[pr]-b[pr]);}sort(ans+1,ans+m+1);

记录路径1配套输出

             ②使用vector,每次更新暴力复制;(下面采用)

if(dp[i+1][j+subtraction[k]] <= dp[i][j] + _plus[k])
{  dp[i+1][j+subtraction[k]] = dp[i][j] + _plus[k];  path[i+1][j+subtraction[k]] = path[i][j];//每次更新都要把path全部复制过来,就是因为这个才用的vector  path[i+1][j+subtraction[k]].push_back(k);
} 

记录路径2(转)

注意:(不知为何)DP顺序,必须是i+1被i更新,原来写的是i被i-1更新,一直WA。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int n,m,a[205],b[205],f[25][805],fix,t,ans[205];
vector<int>pre[25][805];
int main()
{while(scanf("%d%d",&n,&m)==2){t++;memset(f,-1,sizeof f);memset(ans,0,sizeof ans);memset(pre,0,sizeof pre);if(!n&&!m)return 0;for(int i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);fix=20*m;
//        for(int k=0;k<=2*fix;k++)f[0][k]=0;f[0][fix]=0;for(int i=1;i<=n;i++)//第i个人 for(int j=m-1;j>=0;j--)//选了j个 for(int k=0;k<=2*fix;k++){
//                    if(f[j-1][k-a[i]+b[i]]<0)continue;//
//                    if(f[j][k]<f[j-1][k-a[i]+b[i]]+a[i]+b[i])
//                    {
//                        f[j][k]=f[j-1][k-a[i]+b[i]]+a[i]+b[i];
////                        pre[j][k]=i;
//                        pre[j][k]=pre[j-1][k-a[i]+b[i]];
//                        pre[j][k].push_back(i);
//                    }if(f[j][k] >= 0)  {  if(f[j+1][k+a[i]-b[i]]<=f[j][k]+a[i]+b[i])  {  f[j+1][k+a[i]-b[i]]=f[j][k]+a[i]+b[i] ;pre[j+1][k+a[i]-b[i]]=pre[j][k];pre[j+1][k+a[i]-b[i]].push_back(i);  }  }  }int mk;
//        for(int k=fix;k<=2*fix;k++)
//            if(f[m][k]>0)
//            {
//                mk=k;break;
//            }
//        for(int k=fix;k>=0;k--)
//        {
//            if(fix-k>=mk-fix)break;
//            if(f[m][k]>0)
//            {
//                mk=k;break;
//            }
//        }int j=0;while(f[m][fix-j]<0&&f[m][fix+j]<0)j++;if(f[m][fix-j]>f[m][fix+j])mk=fix-j;else mk=fix+j;int d=(f[m][mk]+(mk-fix))/2;int p=(f[m][mk]-(mk-fix))/2;
//        int tmp=mk;
//        for(int j=m;j>0;j--)
//        {
//            int pr=pre[j][tmp];
//            ans[j]=pr;
//            tmp-=(a[pr]-b[pr]);
//        }
//        sort(ans+1,ans+m+1);printf("Jury #%d\nBest jury has value %d for prosecution and value %d for defence:\n",t,d,p);for(int i=0;i<m;i++)printf(" %d",pre[m][mk][i]);printf("\n\n");}
}

转载于:https://www.cnblogs.com/Zinn/p/8571061.html

poj1015陪审团——DP+路径记录相关推荐

  1. POJ1015陪审团(Jury Compromise)——dp+路径记录

    题目:http://poj.org/problem?id=1015 差值是有后效性的,所以"转化为可行性",开一维记录"能否达到这个差值". 当然可以开两维分别 ...

  2. 01背包、完全背包、多重背包问题的C++实现及路径记录

    这里主要实现路径记录,只求最值问题移步 01背包.完全背包.多重背包问题的C++实现 以下均打印输出路径,即装入背包的物品序号,和最大值. 01背包问题 #include <iostream&g ...

  3. floyd和迪杰斯特拉算法的路径记录方法。

    先说迪杰斯特拉,先看题目吧. 题目1 这题就是迪杰斯特拉的路径记录算法题啊,还记录了最小路径个数. 代码如下 #include<iostream> #include<cstdio&g ...

  4. poj--3984--迷宫问题(bfs+路径记录)

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status D ...

  5. vue中的路由2-----嵌套路由跳转,传参和路径记录问题

    vue路由如何传参的问题 这篇文章分为两个部分, 第一个是怎么传过去 第二个是怎么接收信息 在学习之前我们要了解一下路由跳转的规则 (1)路由跳转相当于一个栈,你每跳一次就往栈添加一条数据,所以你可以 ...

  6. 基于STM32跑步路径记录

    基于STM32跑步路径记录   随着科技不断进步,电子化设备不断进入涌入我们的日常生活.生活水平的提高,各项健身运动应运而生,然后,健身运动不能盲目进行,科学的健身方式才能有效的提升我们自身的身体素质 ...

  7. LIS路径记录(UVA481)

    出自一次很失败的开学测试 LIS自然会做 可以参见:https://blog.csdn.net/Radium_1209/article/details/79704234 由于对于LIS的nlogn算法 ...

  8. FatMouse's Speed(LIS+路径记录)

    题目:FatMouse's Speed 题解:采用O(n^2)的LIS算法,用path记录路径 #include<bits/stdc++.h> using namespace std; t ...

  9. poj 1787 Charlie's Change(多重背包路径记录)

    题目:点击打开链接 题意: 给出了一杯咖啡多少钱,和1块,5块,10块,25块各有多少,要正好买这杯咖啡,并且花的硬币越多越好. 思路: 简单的多重背包,类似poj2392,不用二进制优化,恰好买这杯 ...

最新文章

  1. C++:名字空间的使用
  2. 灭霸—个人冲刺(4)
  3. C#-获取页面源代码
  4. 产品需求文档的10步
  5. vivado实现基本D触发器
  6. [java][工具类][Collections]
  7. ruby 集合 分组_在Ruby中打印集合的元素
  8. 第三次作业——朱华泓
  9. Vmware虚拟机修改静态IP无法ping外网,以及eth0不见问题解决
  10. datatable的数据进行组内排序_Spark实现分组Top-k排序的四种方案(scala语言)
  11. Auslogics Registry Cleaner v9.2.0.0 注册表清理优化工具
  12. java keytool下载_keytool gui工具下载
  13. 轻松掌握MySQL数据库锁机制的相关原理
  14. 我该如何带好你—我的团队
  15. 平面三角形外心坐标推导
  16. 教你用Java获取IP归属地
  17. 牙疼不是病疼起来真要命!教你几个止疼小偏方
  18. WPS新建文字分享微信.docx形式_高效神器:花 5 分钟输入文字,就能自动变成 PPT...
  19. C#解析JSON几种方式
  20. Linux查看系统基本信息

热门文章

  1. 淘宝无线端店铺权重提升方法技巧步骤
  2. 通达信V6.1概念板块分类文件格式分析
  3. 专访强生医疗裴兴:后流量思维时代,医美行业迎来数字化大变局
  4. Excle中如何快速筛选数据
  5. 217 绿豆蛙的归宿(数学期望)
  6. html滚动字幕如何控制位置,怎么制作滚动字幕 在视频任意位置加动态广告字幕 控制字幕动画的时间...
  7. 又一次不成功的关于酷我的链接分析
  8. 浪潮和思科联合 华为、新华三怎么看?
  9. 该如何提升自己的编程能力?
  10. 散论陈寅恪先生《对科学院的答复》