Codeforces 808E Selling Souvenirs 题解
2017-05-17 10:55
330 查看
题意
n件物品,每件物品有两个值,重量和价值,重量是1,2,3其中一个数,要选出总重量不超过m的若干物品,求可达到的最大价值思路
dp,先将物品价值按重量放进3个数组中,这里v[i]表示价值为i+1的数组,然后分别从大到小排序,然后考虑只拿1,2的,每个位置记录三个值,当前总价值、用1的数量、用2的数量,按总价值最大进行状态转移,dp[i].val=max(dp[i-1].val+v[0][cnt1],dp[i-2].val+v[1][cnt2]),如果取的是1,那dp[i].cnt1=dp[i-1].cnt1+1,dp[i].cnt2=dp[i-1].cnt2,否则dp[i].cnt1=dp[i-2].cnt1,dp[i].cnt2=dp[i-2].cnt2+1,这样得到了只用重量为1和2的物品且总重量为i时的最大价值,然后考虑3,先对之前的dp数组做前缀最大值的处理,然后枚举使用3的数量,用价值前i的重量为3的物品总价值和dp[m-3*i]相加,取所有组合的最大值即为答案代码
#include <cstdio> #include <algorithm> #include <vector> using namespace std; typedef struct status { long long val; long long cnt1; long long cnt2; }status; vector<long long> v[3]; status s[300001]; int main() { long long n,m,w,c,ans,add; scanf("%I64d%I64d",&n,&m); for(long long i=0;i<n;i++) { scanf("%I64d%I64d",&w,&c); v[w-1].push_back(c); } for(long long i=0;i<3;i++) { sort(v[i].begin(),v[i].end()); reverse(v[i].begin(),v[i].end()); } for(long long i=1;i<=m;i++) { if(s[i-1].cnt1<v[0].size()) { s[i].val=s[i-1].val+v[0][s[i-1].cnt1]; s[i].cnt1=s[i-1].cnt1+1; s[i].cnt2=s[i-1].cnt2; } if(i>=2&&s[i-2].cnt2<v[1].size()&&s[i].val<s[i-2].val+v[1][s[i-2].cnt2]) { s[i].val=s[i-2].val+v[1][s[i-2].cnt2]; s[i].cnt1=s[i-2].cnt1; s[i].cnt2=s[i-2].cnt2+1; } } for(long long i=1;i<=m;i++) if(s[i].val<s[i-1].val) s[i].val=s[i-1].val; ans=0; add=0; for(long long i=0;i<=v[2].size()&&m-3*i>=0;i++) { if(s[m-3*i].val+add>ans) ans=s[m-3*i].val+add; if(i<v[2].size()) add+=v[2][i]; } printf("%I64d\n",ans); return 0; }
相关文章推荐
- Codeforces 777E/778C 题解 (贪心)
- 题解___CodeForces 527A___2015_10_个人赛_1004
- Codeforces 383C Propagating tree 题解&代码
- 题解-python-CodeForces 227A
- Codeforces 935C Fifa and Fafa 题解 附平面几何基础:平面向量基本运算
- 小白题解 Codeforces 785B Anton and Classes
- 【CodeForces】CodeForces Round #466 (Div. 2) 题解
- Codeforces 802J Send the Fool Further! (easy) 题解
- Codeforces 95C Volleyball 题解
- 【CodeForces 729C】【二分+贪心】Road to Cinema 题解
- Trees ——CodeForces - 58C 题解
- Codeforces Round #403 div2 (CodeForces - 782) 题解
- 第六周周赛——AK机会不易得,好好把握题解(出自HDU5650,codeforces 616A,624A,659A,655A,658A)
- codeforces 187 (div2)题解
- Codeforces 338D GCD Table 题解&代码
- 7_6_M题 The Values You Can Make题解[Codeforces 687C](DP)
- 【Codeforces 282E】Sausage Maximization 中文题意&题解&代码(C++)
- 【codeforces】Codeforces Round #311 (Div. 2)only 【题解】
- Codeforces 543C Remembering Strings 题解
- 第六周周赛——AK机会不易得,好好把握题解(出自HDU5650,codeforces 616A,624A,659A,655A,658A)