先把收益为正数的处理掉:策略是挨个扫,扫n遍,碰到能买的就买,然后可以得到一个更新后的r

剩下的就看做是一个背包模型:物品(a,b)表示当背包体积>a时才能装下体积为b的该物品,问最多装几个

无序枚举所有物品显然错误,要选择先买哪个更优

对于两个物品(ai,bi),(aj,bj),有两种顺序

先买i,则至少需要max(ai,aj+bi)的体积

先买j,则至少需要max(aj,ai+bj)的体积

因为每买一件物品,剩余体积必定下降,为了达到某种状态,我们必须选择那种需要体积小的顺序

那么比较 aj+bi和ai+bj即可,转化成比较aj-bj和ai-bi,对这个差值降序排序

/*
排序背包,本题要考虑两个物品(a1,b1),(a2,b2)谁先买
先买第一种最少要max(a1,a2-b1),先买第二件最少要max(a2,a1-b2)
*/
#include<bits/stdc++.h>
using namespace std;
#define N 30005
int dp[][N<<],n,r;
struct Node{
int a,b;
}c[],d[];
int cmp(Node a,Node b){return a.a+a.b>b.a+b.b;}
int cnt1,cnt2,vis[N];
int main(){
cin>>n>>r;
for(int i=;i<=n;i++){
int a,b;cin>>a>>b;
if(b>){
cnt1++;
c[cnt1].a=a,c[cnt1].b=b;
}
else {
cnt2++;
d[cnt2].a=a,d[cnt2].b=b;
}
} int tot=;
for(int i=;i<=cnt1;i++)
for(int j=;j<=cnt1;j++)
if(!vis[j] && r>=c[j].a){
r+=c[j].b;
vis[j]=;
tot++;
break;
} sort(d+,d++cnt2,cmp);
memset(dp,-0x3f,sizeof dp);
dp[][r]=tot;
for(int i=;i<=cnt2;i++)
for(int j=;j<=r;j++){
if(dp[i-][j]>=)//不选第i件
dp[i][j]=dp[i-][j];
if(j-d[i].b>=d[i].a && dp[i-][j-d[i].b]>=)//选第i件
dp[i][j]=max(dp[i][j],dp[i-][j-d[i].b]+);
} int ans=;
for(int j=r;j>=;j--)
if(dp[cnt2][j]>=)ans=max(ans,dp[cnt2][j]);
cout<<ans<<endl;
}

经典排序背包——cf1203F的更多相关文章

  1. 经典排序算法 – 插入排序Insertion sort

    经典排序算法 – 插入排序Insertion sort  插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...

  2. 经典排序算法总结与实现 ---python

    原文:http://wuchong.me/blog/2014/02/09/algorithm-sort-summary/ 经典排序算法在面试中占有很大的比重,也是基础,为了未雨绸缪,在寒假里整理并用P ...

  3. 经典排序算法及python实现

    今天我们来谈谈几种经典排序算法,然后用python来实现,最后通过数据来比较几个算法时间 选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据 ...

  4. 经典排序算法 - 基数排序Radix sort

    经典排序算法 - 基数排序Radix sort 原理类似桶排序,这里总是须要10个桶,多次使用 首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,临时忽视十位数 比如 待排序数组[ ...

  5. 经典排序算法 - 高速排序Quick sort

    经典排序算法 - 高速排序Quick sort 原理,通过一趟扫描将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整 ...

  6. 经典排序算法 - 归并排序Merge sort

    经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...

  7. C# 经典排序算法大全

    C# 经典排序算法大全 选择排序 using System; using System.Collections.Generic; using System.Linq; using System.Tex ...

  8. Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现

    2017年4月29日~5月1日,国际劳动节, 三天的小长假. 在国内,小长假往往是这样的: 然而我当时在戏称为"德村"(德国农村)的Walldorf出差并且住在Wiesloch, ...

  9. 【最全】经典排序算法(C语言)

    算法复杂度比较: 算法分类 一.直接插入排序 一个插入排序是另一种简单排序,它的思路是:每次从未排好的序列中选出第一个元素插入到已排好的序列中. 它的算法步骤可以大致归纳如下: 从未排好的序列中拿出首 ...

随机推荐

  1. Steup factory 面板介绍

    2   安装软件信息     注册码  过期时间等一些设置 3 4 5

  2. Reverse array

    数组颠倒算法 #include <iostream> #include <iterator> using namespace std; void reverse(int* A, ...

  3. CF 1045 H. Self-exploration 解题报告

    CF 1045 H. Self-exploration 考虑到串的结构一定是 1...0....1....0.....1... 这样的,而\(01\)与\(10\)在转折点交替出现 首先串长一定是\( ...

  4. SQL必知必会——创建和操纵表(十七)

    1.创建表 一般有两种创建表的方法: 多数DBMS都具有交互式创建和管理数据库表的工具表也可以直接用SQL语句操纵1.1.表创建基础 CREATE TABLE products( prod_id,CH ...

  5. sql格式化工具推荐

    还在为上百行甚至上千行冗余的sql烦恼吗?这里推荐一款在线美化sql的工具 工具地址:http://www.matools.com/sql 怎么样,黑屏界面是不是带有满满的黑科技感? 该工具支持ora ...

  6. C++——模板

    1.参数类型 template <typename T> void f1(T&);//实参必须是左值 f1(i);//对 f1(ci);//对,T的类型是const int f1( ...

  7. Opengl ES Glew库 ----- By YDD的铁皮锅

    前一篇随笔我写了Opengl的窗口创建,这一篇随笔我要写OpenGL glew库的使用.首先需要引入头文件h,库文件Lib和动态链接库DLL, 百度搜索OpenGL glew库找到这个纯英文网站,尽量 ...

  8. 在响应式布局中,碰到图片不会自动缩放,因此需要一段js脚本

    <script> (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchang ...

  9. 2019秋季学期第2周Java学习总结

    本周在第一周接触认识Java后对该编程语言有了进一步了解,明白了Java的类型:包括Application程序,Applet程序.知道了一个Java程序的关键字(public class).主方法(p ...

  10. LVM-扩容目录

    LVM LVM是一种源自Unix环境,在Linux上广泛应用的逻辑虚拟盘存储方案.借助LVM,可以在保证各个Linux目录分区稳定,又可以实现各目录存储资源灵活分配. 本文主要系统介绍Linux环境下 ...