poj1015 01二维背包
/*
给定辩控双方给每个人的打分p[i],d[i],
dp[j][k]表示前i个人有j个被选定,选定的人的辩控双方打分差之和是k,此状态下的最大辩控双方和
按01背包做,体积一维是1,体积二维是辩控双方打分差,价值是辩控双方打分和
要求体积一维不得超过m,体积二维在体积一维=m的情况下最小
状态转移方程:dp[j][k]=max(dp[j][k],dp[j-1][k-(a[i]-b[i])]+a[i]+b[i])
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
struct node{
int a,b,sum,dif;
}p[];
int dp[][]; int main(){
int n,m,tt=;
while(scanf("%d%d",&n,&m),n){
memset(dp,-,sizeof dp); vector<int> path[][];
for(int i=;i<=n;i++){
scanf("%d%d",&p[i].a,&p[i].b);
p[i].sum=p[i].a+p[i].b;
p[i].dif=p[i].a-p[i].b;
} int max_diff=m*;//由于两者之差可能是负数,所以在所有差值上增加一个max_diff dp[][max_diff]=;
for(int i=;i<=n;i++)
for(int j=m;j>=;j--)//逆序枚举,保证每个候选人最多被选一次
for(int k=;k<=max_diff*;k++)
if(dp[j-][k]>=)
if(dp[j-][k]+p[i].sum>dp[j][k+p[i].dif]){
dp[j][k+p[i].dif]=dp[j-][k]+p[i].sum;
path[j][k+p[i].dif]=path[j-][k];
path[j][k+p[i].dif].push_back(i);
} int i,min_diff;
for(i=;i<=max_diff;i++)
if(dp[m][max_diff-i]>=||dp[m][max_diff+i]>=) break;
//找到最小的差 i
if(dp[m][max_diff-i]>dp[m][max_diff+i]) min_diff=max_diff-i;
else min_diff=max_diff+i;
cout << (dp[m][min_diff]+i)/ << " " <<(dp[m][min_diff]-i)/ << endl;
for(int i=;i<m;i++)
cout << path[m][min_diff][i] << " ";
puts(" ");
}
}
poj1015 01二维背包的更多相关文章
- 01二维背包——poj2576
/* 要求把a数组分成两个集合,两个集合人数最多差1,并且元素之和的差尽可能小 那只要把所有可行的列出来即可 01二维背包,即体积是个二维数据,那么我们的背包状态也应该设为二维 dp[j][k]设为 ...
- 01二维背包+bitset优化——hdu5890
口胡一种别的解法: 三重退背包,g1[j]k]表示不选x的选了j件物品,体积为k的方案数,g[0][0] = 1 , g1[j][k]=dp[j][k]-g1[j-1][k-a[x]] 然后按这样再退 ...
- HDU 2159 FATE (二维背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159 解题报告:这题实际上是一个二维的背包问题,也可以由01背包扩展而来,01背包用一维数组,可想而知 ...
- NOI 4978 宠物小精灵之收服(二维背包)
http://noi.openjudge.cn/ch0206/4978/ 描述 宠物小精灵是一部讲述小智和他的搭档皮卡丘一起冒险的故事. 一天,小智和皮卡丘来到了小精灵狩猎场,里面有很多珍贵的野生宠物 ...
- 二维背包---P1855 榨取kkksc03
P1855 榨取kkksc03 题解 二维背包板子题 f[ i ][ j ] 前 n 个物品,花费金钱不超过 i ,花费时间不超过 j 的最大价值 如果每个物品只能选一次,那么就相当于在01背包上多加 ...
- 二维背包(钟神想要的)(不是DP)
[问题描述] 背包是个好东西,希望我也有.给你一个二维的背包,它的体积是? × ?.现在你有一些大小为1× 2和1×3的物品,每个物品有自己的价值.你希望往背包里面装一些物品,使得它们的价值和最大,问 ...
- hdu 4501 小明系列故事——买年货_二维背包
题目:你可以有v1元,v2代金券,v3个物品免单,现在有n个商品,商品能用纸币或者代金券购买,当然你可以买v3个商品免费.问怎么最大能买多少价值 题意: 思路二维背包,dp[v1][v2][v3]=M ...
- rqnoj-329-刘翔!加油!-二维背包
注意排除干扰项. 因为价值不会相等,所以价值的多少与本题没有任何关系,. 所以价值为干扰项,所以不用考虑. 二维背包,简单求解. #include<stdio.h> #include< ...
- dp之二维背包poj2576
题意:有一群sb要拔河,把这群sb分为两拨,两拨sb数只差不能大于1,输出这两拨人的体重,小的在前面...... 思路:把总人数除2,总重量除2,之后你会发现就是个简单的二维背包,有两个限制..... ...
随机推荐
- VNC 在ubuntu desktop下只显示空白桌面
看不到上下的菜单栏,但是有桌面.要么是配置文件,要么是gnome缺组件. 1.先安装组件 apt-get install --no-install-recommends ubuntu-desktop ...
- sublime 格式化代码
将压缩成一行的 css 代码转换成未压缩的格式: 安装sublime下的HTML-CSS-JS Prettify插件,之后右键,选择 html/css/js Prettify 下面的Prettify ...
- Spark记录-SparkSql官方文档中文翻译(部分转载)
1 概述(Overview) Spark SQL是Spark的一个组件,用于结构化数据的计算.Spark SQL提供了一个称为DataFrames的编程抽象,DataFrames可以充当分布式SQL查 ...
- 部署flask
部署 当我们执行下面的hello.py时,使用的flask自带的服务器,完成了web服务的启动.在生产环境中,flask自带的服务器,无法满足性能要求,我们这里采用Gunicorn做wsgi容器,来部 ...
- 运用Zabbix实现内网服务器状态及局域网状况监控(3) —— Zabbix服务端安装
1. Zabbix服务端安装,基于LNMP PHP5.5+Nginx1.9安装配置:http://www.cnblogs.com/vurtne-lu/p/7707536.html MySQL5.5编译 ...
- eclipse导入项目后找不到.class文件
今天从git上clone代码到eclipse中,发现项目->右键没有java build path选项,而且src下没有包路径,都显示成文件夹. 发现项目中没有.class文件 后来发现项目-& ...
- hive vs hbase
HIVE和HBASE区别 两者分别是什么? Apache Hive是一个构建在Hadoop基础设施之上的数据仓库.通过Hive可以使用HQL语言查询存放在HDFS上的数据.HQL是一种类SQL语言,这 ...
- mysql的事件
mysql的事件定时器的使用: SHOW VARIABLES LIKE 'event_scheduler' --查询event_scheduler开启状态 SET GLOBAL event_sched ...
- Debian/Ubuntu 下网易云音乐无法由图标/列表 打开的解决方案
前言 本文为使用图标或快捷方式直接打开网易云音乐的一个从安装说起的到解决问题的简单教程 环境 debian 9.5 理论上使用apt包管理器的发行版均支持 源使用国内的源即可,无需特殊指定 安装网易云 ...
- IDEA不生成WAR包,报错
com.intellij.javaee.oss.admin.jmx.JmxAdminException: com.intellij.execution.ExecutionExceptionProjec ...