经典排序背包——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语言)
		算法复杂度比较: 算法分类 一.直接插入排序 一个插入排序是另一种简单排序,它的思路是:每次从未排好的序列中选出第一个元素插入到已排好的序列中. 它的算法步骤可以大致归纳如下: 从未排好的序列中拿出首 ... 
随机推荐
- nucleus plus学习总结(后续)
			前言: 刚刚抽筋点了保存发布,结果要审核,那就分开写个续好了. 内容: signal 信号是异步通知task的一种机制,HISR是不可以接收信号的,但是可以发送信号. TCB中 ... 
- nucleus 学习 中断
			;************************************************************************ ;* ;* FUNCTION ;* ;* INT_I ... 
- SPOJ - VLATTICE (莫比乌斯反演)
			Consider a N*N*N lattice. One corner is at (0,0,0) and the opposite one is at (N,N,N). How many latt ... 
- BZOJ 4568: [Scoi2016]幸运数字(倍增+线性基)
			传送门 解题思路 异或最大值肯定线性基了,树上两点那么就倍增搞一搞,就维护每个点到各级祖先的线性基,时间复杂度\(O(nlog^3n)\),并不知道咋过去的. 代码 #include<iostr ... 
- vue 微信公众号分享后支付失效页面URL不变的坑
			微信分享后支付页面还是初始页面,这个问题解决了, created(){ //判断是否是IOS设备 // IOS分享时的页面是首页,也就是进入页而不是当前页.所有可以采用刷新当前页,让进入页的链接改成当 ... 
- selenium IDE 安装环境配置
- 再次安装双linux系统及kali的grub修复!
			打算下学期不带笔记本,平时编程上网本就够了,也就看看一般的算法,于是那上网本装centos7和kali,上网本是APU,但是这两个版本的linux都支持的不错. 先安装centos,由于熟悉了linu ... 
- leetcode上的一些单链表
			147- 思路: 148- 思路: 24- 思路: 25- 思路: 21- 思路: 109- 思路: 237- 思路: 
- HTML5: HTML5 Web Workers
			ylbtech-HTML5: HTML5 Web Workers 1.返回顶部 1. HTML5 Web Workers web worker 是运行在后台的 JavaScript,不会影响页面的性能 ... 
- c++简单String类实现
			#include <iostream> #include <string> using namespace std; class String { public: String ... 
