【dp】E. Selling Souvenirs
http://codeforces.com/contest/808/problem/E
题意:给定n个重量为可能1,2,3的纪念品和各自的价值,问在背包总重量不超过m的条件下总价值最大为多少。
其中1 ≤ n ≤ 100000, 1 ≤ m ≤ 300000
首先可以想到的是重量相同的情况下,优先选择价值大的纪念品。所以我们可以把价值为1,2,3的纪念品分开,分别排序。
我们可以枚举重量为3的纪念品的个数为x,然后剩下的重量m-sum{3-elements}由1和2混合得出,这里可以动态规划预处理。
dp[i]是一个三元组{cost,cnt1,cnt2},分别表示重量为i的情况下的最大价值,以及这时候1和2分别用了多少。
dp[i]可以dp[i-1]和dp[i-2]推出。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<utility>
using namespace std;
typedef long long ll;
const int maxn=3e5+; struct node
{
ll cost;
int cnt1;
int cnt2;
}dp[maxn];
ll sum[maxn];
ll a[maxn],b[maxn],c[maxn];
int n,m;
int main()
{
scanf("%d%d",&n,&m);
int weight;
ll cost;
int p=,q=,r=;
for(int i=;i<n;i++)
{
// scanf("%d%lld",&weight,&cost);
cin>>weight>>cost;
if(weight==)
{
a[p++]=cost;
}
else if(weight==)
{
b[q++]=cost;
}
else
{
c[r++]=cost;
}
}
sort(a,a+p);
sort(b,b+q);
sort(c,c+r);
dp[].cost=;
dp[].cnt1=p;
dp[].cnt2=q;
dp[].cost=a[p-];
dp[].cnt1=p-;
dp[].cnt2=q;
for(int i=;i<=m;i++)
{
if(dp[i-].cnt1->=&&dp[i-].cnt2->=)
{
if(dp[i-].cost+a[dp[i-].cnt1-]>dp[i-].cost+b[dp[i-].cnt2-])
{
dp[i].cost=dp[i-].cost+a[dp[i-].cnt1-];
dp[i].cnt1=dp[i-].cnt1-;
dp[i].cnt2=dp[i-].cnt2;
}
else
{
dp[i].cost=dp[i-].cost+b[dp[i-].cnt2-];
dp[i].cnt1=dp[i-].cnt1;
dp[i].cnt2=dp[i-].cnt2-;
}
}
else if(dp[i-].cnt1-<&&dp[i-].cnt2->=)
{
dp[i].cost=dp[i-].cost+b[dp[i-].cnt2-];
dp[i].cnt1=dp[i-].cnt1;
dp[i].cnt2=dp[i-].cnt2-;
}
else if(dp[i-].cnt1->=&&dp[i-].cnt2-<)
{
dp[i].cost=dp[i-].cost+a[dp[i-].cnt1-];
dp[i].cnt1=dp[i-].cnt1-;
dp[i].cnt2=dp[i-].cnt2;
}
else
{
break;
}
}
sum[r]=;
for(int i=r-;i>=;i--)
{
sum[i]=sum[i+]+c[i];
}
ll ans=;
for(int i=;i<=m;i++)
{
int x=(m-i)/;
ll temp=dp[i].cost+sum[max(r-x,)];
if(temp>ans)
{
ans=temp;
}
}
cout<<ans<<endl; return ;
}
注意一些小细节:
ll temp=dp[i].cost+sum[max(r-x,)];
重量为3的可能不够用
【dp】E. Selling Souvenirs的更多相关文章
- Kattis - honey【DP】
Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...
- HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】
HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HDOJ 1257 最少拦截系统 【DP】
HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDOJ 1159 Common Subsequence【DP】
HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- HDOJ_1087_Super Jumping! Jumping! Jumping! 【DP】
HDOJ_1087_Super Jumping! Jumping! Jumping! [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- POJ_2533 Longest Ordered Subsequence【DP】【最长上升子序列】
POJ_2533 Longest Ordered Subsequence[DP][最长递增子序列] Longest Ordered Subsequence Time Limit: 2000MS Mem ...
- HackerRank - common-child【DP】
HackerRank - common-child[DP] 题意 给出两串长度相等的字符串,找出他们的最长公共子序列e 思路 字符串版的LCS AC代码 #include <iostream&g ...
- LeetCode:零钱兑换【322】【DP】
LeetCode:零钱兑换[322][DP] 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成 ...
随机推荐
- wamp无法进入phpMyAdmin或localhost的解决方法
我用的是最新版的wampsever5,在win7(64位)下安装正常使用,没有无法进入phpMyAdmin的问题,但是我在虚拟机安装了win8(64位专业版),测试在win8下面的使用情况时,就有问题 ...
- angularjs之ng-mode获取lobject类型里的键值
有时候数据库定义的时候,用一个对象来代表某个属性,之后直接访问对象就可以获取全部该对象的属性,但是有时需求访问对象中包含中的键值,引用键值的时候可以直接用.来获取对象的键值,比如 对象points: ...
- QWidget标题栏双击事件
widget.h virtual bool event(QEvent *event); widget.cpp bool Widget::event(QEvent *event) { if (event ...
- 【HEVC简介】High Level Syntax
参考文献:见<High Efficiency Video Coding (HEVC)>High Level Syntax章节 <HEVC标准介绍.HEVC帧间预测论文笔记>系列 ...
- zc.buildout构建项目时报错‘AttributeError: '_NamespacePath' object has no attribute 'sort'’
在使用zc.buildout构建项目时如果碰到‘AttributeError: '_NamespacePath' object has no attribute 'sort'’报错: An inter ...
- 一行命令杀掉defunct进程
一行命令杀掉defunct进程 今天在杀掉defunc过程中一直搞不完,索性写一行命令,注意先看懂谨慎使用 ps -ef|grep defunct|awk '{print " ps -ef| ...
- node节点的部署
master点赋予用户权限 [root@mast-1 k8s]# kubectl create clusterrolebinding kubelet-bootstrap \ > --cluste ...
- mybatis-4 mybatis与spring结合使用及原理
1.创建项目maven,方便依赖下载.使用的jar如下: <dependencies> <dependency> <groupId>org.springframew ...
- VS2015安装SVN插件
一.下载VISUALlSVN 官网下载:地址 选择[VisualSVN for Visual Studio 2015 and older]的下载按钮下载,目前版本号VisualSVN 5.1.9,支持 ...
- 线段树、KMP、HASH模板
线段树 #include<cstdio> using namespace std; int n,p,a,b,m,x,y,ans; struct node { int l,r,w,f; }t ...