经典排序背包——cf1203F
先把收益为正数的处理掉:策略是挨个扫,扫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的更多相关文章
- 经典排序算法 – 插入排序Insertion sort
经典排序算法 – 插入排序Insertion sort 插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...
- 经典排序算法总结与实现 ---python
原文:http://wuchong.me/blog/2014/02/09/algorithm-sort-summary/ 经典排序算法在面试中占有很大的比重,也是基础,为了未雨绸缪,在寒假里整理并用P ...
- 经典排序算法及python实现
今天我们来谈谈几种经典排序算法,然后用python来实现,最后通过数据来比较几个算法时间 选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据 ...
- 经典排序算法 - 基数排序Radix sort
经典排序算法 - 基数排序Radix sort 原理类似桶排序,这里总是须要10个桶,多次使用 首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,临时忽视十位数 比如 待排序数组[ ...
- 经典排序算法 - 高速排序Quick sort
经典排序算法 - 高速排序Quick sort 原理,通过一趟扫描将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整 ...
- 经典排序算法 - 归并排序Merge sort
经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...
- C# 经典排序算法大全
C# 经典排序算法大全 选择排序 using System; using System.Collections.Generic; using System.Linq; using System.Tex ...
- Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现
2017年4月29日~5月1日,国际劳动节, 三天的小长假. 在国内,小长假往往是这样的: 然而我当时在戏称为"德村"(德国农村)的Walldorf出差并且住在Wiesloch, ...
- 【最全】经典排序算法(C语言)
算法复杂度比较: 算法分类 一.直接插入排序 一个插入排序是另一种简单排序,它的思路是:每次从未排好的序列中选出第一个元素插入到已排好的序列中. 它的算法步骤可以大致归纳如下: 从未排好的序列中拿出首 ...
随机推荐
- Java 基础 - 自动装箱,valueOf装箱,new -->使用 == 和 equals比较
总结 关于equals 比较 记住:equals方法比较的是真正的值 两个包装类比较,比较的是包装的基本数据类型的值 基本数据类型和包装类型比较时,会先把基本数据类型包装后再比较 (但是因为equa ...
- SCP-bzoj-1084
项目编号:bzoj-1084 项目等级:Safe 项目描述: 戳这里 特殊收容措施: 分类讨论+DP.#滑稽 预处理前缀和s[i][s]=Σa[j][s](∀j∈[1,i])(m=1时略去第二维) 对 ...
- php+js实现极验滑块拖动验证码-tncode
先上图: 演示地址:http://aso.39gs.com/tncode/index.html 相信在淘宝,斗鱼这些大网站都见到过这样的验证码了,拖动验证码比传统在移动端有更好的化验,减少用户的输入. ...
- 用 Flask 来写个轻博客 (7) — (M)VC_models 的关系(many to many)
目录 目录 前文列表 扩展阅读 前期准备 多对多 使用样例 一直在使用的 session 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写个轻博客 (2) - Hel ...
- 使用soapui进行webservice接口测试
一.web service(SOAP)与HTTP接口的区别 1.什么是web service WebService就是Web服务的意思,对应的应用层协议为SOAP(相当于HTTP协议),可理解为远 ...
- spring data jpa 关联设计
MAP关联实体 // @ElementCollection @OneToMany(cascade = {CascadeType.ALL})// @JoinColumn(name = "the ...
- 快速调通支付宝当面付Demo
1.访问如下地址: https://auth.alipay.com/login/ant_sso_index.htm?goto=https%3A%2F%2Fopenhome.alipay.com%2Fp ...
- servlet的ServletContext接口
ServletContext Servlet 上下文 每个web工程都只有一个ServletContext对象,也就是不管在哪个servlet里面,获取到的这个ServletContext对象都是同一 ...
- 2018年分享的Spring Cloud 2.x系列文章
还有几个小时2018年就要过去了,盘点一下小编从做做公众号以来发送了273篇文章,其中包含原创文章90篇,虽然原创的有点少,但是2019年小编将一如既往给大家分享跟多的干货,分享工作中的经验,让大家在 ...
- 回头看看HTML5
前言:自从学习各种框架各种成熟的控件库,越来越觉得疲惫. 一.用语义元素构造网页 在html5中最常用到的页面结构相关的语义元素如下: 页面结构想相关的语义元素 元素 说明 <article&g ...