HDU 5887 Herbs Gathering

背包,$map$,优化。

和普通背包一样,$map$加一个$erase$优化一下就可以跑的很快了。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-6;
void File()
{
    freopen("D:\\in.txt","r",stdin);
    freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
    char c=getchar(); x=0;
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) {x=x*10+c-‘0‘; c=getchar();}
}

int n; LL m;
struct X { LL x,y; }s[110];

int main()
{
    while(~scanf("%d%lld",&n,&m))
    {
        map<LL,LL>dp;
        for(int i=1;i<=n;i++) scanf("%lld%lld",&s[i].x,&s[i].y);

        dp[0]=0; map<LL,LL>::iterator it;
        for(int i=1;i<=n;i++)
        {
            it=dp.end(); --it;
            for (; ; )
            {
                LL c=it->first, v=it->second;
                if(c+s[i].x<=m) dp[c+s[i].x]=max(dp[c+s[i].x],dp[c]+s[i].y);
                if(it==dp.begin()) break; --it;
            }

            it=dp.begin(); LL mx=0;
            for (; it != dp.end(); )
            {
                if (it->second!=0&&it->second<=mx) dp.erase(it++);
                else { mx=it->second; ++it; }
            }
        }

        LL ans=0;  it=dp.begin();
        for (; it != dp.end(); )
        {
            ans=max(ans,it->second);
            ++it;
        }
        printf("%lld\n",ans);
    }
    return 0;
}
时间: 2024-10-26 22:42:28

HDU 5887 Herbs Gathering的相关文章

HDU 5887 Herbs Gathering(搜索求01背包)

http://acm.hdu.edu.cn/showproblem.php?pid=5887 题意: 容量很大的01背包. 思路: 因为这道题目背包容量比较大,所以用dp是行不通的.所以得用搜索来做,但是需要一些剪枝,先按体积排序,优先考虑体积大的物品,这样剪枝会剪得多一些(当然按照性价比排序也是可以的). 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdi

hdu 5887 搜索+剪枝

Herbs Gathering Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 687    Accepted Submission(s): 145 Problem Description Collecting one's own plants for use as herbal medicines is perhaps one of t

「HDU 5887」Herbs Gathering

题意:原题在这 给定背包容量和n个物品每个的价值和重量,求能装的物品的最大价值.(采药) 附一组自己出的数据,虽然不够刁钻但是查错够用: 5 100 101 200 99 1 1 2 98 20 2 50 思路: 做法1: 1. 因为dp解法的复杂度为O(V*N),w[i]和v[i]都在10e9,所以不能dp只能dfs 2. 一种按体积排序的做法: 按照体积由大到小排序,如果后面能取完的就直接取完; 如果后面一直选择最优策略(能获得的最大价值加上已有的)都不好于现在的答案则break; (参考:

HDU5887 Herbs Gathering(搜索 剪枝)

背包问题,由于数据大不容易dp,改为剪枝,先按性价比排序,若剩下的背包空间都以最高性价比选时不会比已找到的最优解更好时则剪枝,即 if(val + (LD)pk[d].val / (LD)pk[d].w * (lim - w) + EPS <= ans){ return; } 没想到一发过,0ms #include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #inclu

【2016 ACM/ICPC Asia Regional Qingdao Online】

[ HDU 5878 ] I Count Two Three 考虑极端,1e9就是2的30次方,3的17次方,5的12次方,7的10次方. 而且,不超过1e9的乘积不过5000多个,于是预处理出来,然后每次二分找就可以了. /* TASK:I Count Two Three 2^a*3^b*5^c*7^d的最小的大于等于n的数是多少 LANG:C++ URL:http://acm.hdu.edu.cn/showproblem.php?pid=5878 */ #include <iostream>

2016 ACM/ICPC Asia Regional Qingdao Online

吐槽: 群O的不是很舒服 不知道自己应该干嘛 怎样才能在团队中充分发挥自己价值 一点都不想写题 理想中的情况是想题丢给别人写 但明显滞后 一道题拖沓很久 中途出岔子又返回来搞 最放心的是微软微软妹可以随便丢 有几个小盆友也比较靠谱 还有几个小盆友一开始有点担心 后来都做的挺棒 写题的选择上很尴尬 会写的别人也会 要么队内都不会 结果大概是写了一些板子题 感觉到了比较艰难的阶段 有些题是要我学着去写的 不会写没有突破 1001 I Count Two Three AC by ctr 指数不会很大,

HDU 3128 What is the air speed velocity…(数学)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3128 Problem Description What is the air speed velocity- -of a fully laden swallow? This fearful question was posed to the intrepid band of Grail searchers.Their response of "African or European?" w

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include