【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.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成 ...
随机推荐
- 服务器php-cgi.exe进程过多,导致CPU占用100%的解决方法
再使用iis服务器中经常会出现php-cgi.exe进程过多,导致CPU占用100%,最终造成网站运行过慢甚至卡死的情况,重启iis会好一会,过一段时间久出现这种情况,为什么会出现这种情况呢,应该怎么 ...
- 转 Java 208道面试题及部分答案 补充部分答案
转自https://www.cnblogs.com/chen1005/p/10481102.html ---恢复内容开始--- 一.Java 基础 1.JDK 和 JRE 有什么区别? 答:JRE ...
- iphone x 高度:100%; 兼容设置
问题: iphone x 会遇到页面设置 height:100%;之后但是底部还有一定的高度没有覆盖 解决方法: 1.让客户端设置webview的高度为100%; 2.html代码里面添加 viewp ...
- 第一章 熟悉Objective -C 编写高质量iOS与OS X代码的52 个有效方法
第一章 熟悉Objective -C 编写高质量iOS与OS X代码的52 个有效方法 第一条: 了解Objective-C 语言的起源 关键区别在于 :使用消息结构的语言,其运行时所应执行 ...
- whereis参数
-b 只找二进制文件 -m 只找在帮助文件manual路径下的文件 -s 只找原文件 -u 没有帮助文件的文件 whereis passwd
- [Windows Server 2012] 安装IIS8.5及FTP
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:安装IIS ...
- HDU 5416 CRB and Tree (技巧)
题意:给一棵n个节点的树(无向边),有q个询问,每个询问有一个值s,问有多少点对(u,v)的xor和为s? 注意:(u,v)和(v,u)只算一次.而且u=v也是合法的. 思路:任意点对之间的路径肯定经 ...
- chart 图片组件 生成后不能动态更新,需要销毁dom,从新载入 用 v-if 和 this.$nextTick(() => {
<chart-box v-if="cbData1Bool" cb-text="基本概况" chartBoxSele="饼状图" :cb ...
- PHP16 PHP访问MySQL
学习要点 PHP访问MySQL配置 PHP访问MySQL函数介绍 足球赛程信息管理 PHP访问MySQL配置 PHP.ini配置文件确认以下配置已经打开 extension=php_mysql.dll ...
- Java中的代理--proxy
讲到代理,好像在之前的springMVC,还是spring中或者是hibernate中学习过,并没有特别在意,这次好好理解一下.(原来是在spring中的AOP,面向切面 Aspect Oriente ...