link
01背包

思路

f[i][j][k]表示在前i个人中选出j个人,此时辩方总分与控方总分差为k时,二者和的最大值
转移方程即为:f[i][j][k] = max(f[i][j][k],f[i-1][j-1][k-a[i]+b[i]]+a[i]+b[i])

  1. 维护 fff 数组
    由于是绝对值,所以要用一个偏移量delta,由于评分都在0-20之间,且最多选20人,也就是说abs(k)最多为400,于是这里取delta = 400,所以 k 的范围就是 0≤k≤8000 \leq k \leq 8000≤k≤800。
  2. 找出最小差值k
    显然就是最接近400的数。
  3. 找出对应的方案入选的人
    方法是反过来推。首先从f[i][j][v](i=n,j=m,这里的v是上面找出来的最小差值加上base)开始,判断他是由哪一种情况得来(选与不选),若是不选,直接将i–;若选,记录人选,将v减掉该人的差值,
    再i–,j–。
    也正是因为要找出对应方案入选的人,本题不能优化为二维数组。

代码

int f[210][21][805];//f[i][j][k]表示在前i个人中选出j个人,此时辩方总分与控方总分差为k时,二者和的最大值
int a[210], b[210];
void solve() {int n, m;int t = 0;while(cin >> n >> m && n) {for(int i = 1; i <= n; i++) {cin >> a[i] >> b[i];// a[i] += 20;}cout << "Jury #" << ++t << endl;memset(f, -0x3f,sizeof(f));f[0][0][400] = 0;for(int i = 1; i <= n; i++) {for(int j = 0; j <= m; j++) {for(int k = 0; k <= 800; k++) {int p = k - (a[i] - b[i]);f[i][j][k] = f[i-1][j][k];if(j - 1 < 0) continue;if(p < 0 || p > 800) continue;f[i][j][k] = max(f[i][j][k], f[i-1][j-1][p] + a[i] + b[i]);}}}int v = 0;while(f[n][m][400-v] < 0 && f[n][m][400 + v] < 0) v++;if(f[n][m][400-v] > f[n][m][400+v]) v = 400 - v;else v = 400 + v;// cout << f[n][m][v] << endl;int ans1, ans2;ans1 = (f[n][m][v] + abs(v - 400)) / 2;ans2 = f[n][m][v] - ans1;if(v < 400) swap(ans1, ans2);stack<int> s;int j = m;for(int i = n; i >= 1; i--) {if(f[i][j][v] == f[i-1][j][v]) {continue;}s.push(i);v -= a[i] - b[i];j--;}printf("Best jury has value %d for prosecution and value %d for defence:\n",ans1, ans2);cout << ' ';while(!s.empty()) {cout << s.top() << ' ';s.pop();}cout << endl << endl;}
}

acwing280.陪审团 01背包相关推荐

  1. 陪审团(01背包, 难)

    在一个遥远的国家,一名嫌疑犯是否有罪需要由陪审团来决定. 陪审团是由法官从公民中挑选的. 法官先随机挑选N个人(编号1,2-,N)作为陪审团的候选人,然后再从这N个人中按照下列方法选出M人组成陪审团. ...

  2. 浅说——九讲背包之01背包

    所谓九讲,也就是: 0/1背包 0/1背包降维 完全背包 多重背包(二进制优化) 混合背包 二维费用背包 分组背包 有依赖的背包 背包的方案总数\背包的具体方案路径 0/1背包: [问题描述](经典) ...

  3. Codeforces Round #104 (Div. 2) E DP(01背包模型) +组和+除法取模求逆元

    题意: 规定只包含4或7的数为幸运数字,给定n个数的序列,求他的子序列,使得该子序列的长度为k并且满足该子序列中不存在相同的两个幸运数字.问一共寻在多少种可能.(只要该数的下标不同则认为是不同的序列) ...

  4. 最小邮票数(01背包)

    题目描述 有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值.     如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分.3分.4分即可. 输入描述: 有多组数 ...

  5. NYOJ 860 又见01背包

    有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W  的物品,求所有挑选方案中物品价值总和的最大值. 1 <= n <=100 1 <= wi < ...

  6. 背包问题(多重背包+0-1背包)

    一:0-1背包问题 #include<iostream> #include<algorithm> #include<cstring> const int maxn= ...

  7. 背包模型dp1:01背包,完全背包,多重背包的两大优化的详解

    01背包问题: 状态表示:f[i][j]表示从只从前i个物体里面选,切总体积不超过j的选法的集合状态表示:f[i][j]表示从只从前i个物体里面选,切总体积不超过j的选法的集合状态表示:f[i][j] ...

  8. CF3B Lorry (手动模拟01背包,贪心)难度⭐⭐⭐

    这道题洛谷上的翻译是错的,最后输出格式那里应该是输出一行所选物品的编号,中间用空格隔开 手动模拟01背包 这道题看上去很像是01背包的模板题,但是很明显,v=1e9,正常的01背包是肯定会爆掉62MB ...

  9. 【每日DP】day4 P1417 烹调方案(奇怪的01背包增加了)难度⭐⭐⭐

    P1417 烹调方案 每件物品只有一个,很明显是01背包,但是价值的转换方式不同,是要求 ai−t∗bia_i-t*b_iai​−t∗bi​ 尽可能最大.普通的01背包的价值是不变的,而这一道题目中的 ...

最新文章

  1. 解决Mac下npm权限问题
  2. Spring 定时器
  3. 铁乐学python_Day40_进程池
  4. mysql数据库知识点梳理_MySQL数据库知识点整理 (持续更新中)
  5. 网贷大数据什么时候会好_如果人类把地球钻穿了,会发生什么?大数据分析告诉你多可怕...
  6. MyBatis框架 传参、事务、缓存(二级)
  7. MongoDB 初体验:存储引擎 MMAPv1 与高内存消耗及升级迁移
  8. C/C++ 指针数组、二维数组
  9. 【Hadoop笔记_3】MapReduce、案例分析、实例分析代码
  10. 我爱你——再高级一点
  11. 求区域的最大内接矩形
  12. 大数据相关各职位解析
  13. excel操作记录——条形图
  14. 为 什 么 说 Synchronized 是 一 个 悲 观 锁 ?
  15. Simulink电力电子仿真01
  16. VAE+TSNE-mnist可视化项目
  17. 基于jsp,ssm进销存管理系统
  18. 香港惊现“人才荒”!IT毕业生就业率近100%,起薪超2.3W!
  19. c语言函数指针做解释器,自己动手写解释器(1):函数定义和调用
  20. Div元素 html

热门文章

  1. 采用轻型MiWi协议,Microchip发起进军WPAN首轮
  2. 桑榆之年,你将如何谢幕这一生?
  3. 台式计算机重装系统,台式机重装系统其实很简单!
  4. python一行输出多个数据_如何在Python中让两个print()函数的输出打印在一行内?
  5. AWS S3 and Glacier
  6. 敏俊物联MJIOT-AMB-02 RTL8195M 高性能wifi模块
  7. RHCE 第十一天 mail postfix dovecot SSL
  8. 微信最近点赞拿东西服务器,微信朋友圈点赞说明什么?点赞的行为背后隐藏着什么含义呢?...
  9. 撕开帝国裂缝的互联网+饮料公司——元气森林是如何做的?
  10. OpenPAI1.3.0 部署