HDOJ 5887 Herbs Gathering 【2016青岛网赛】DP+MAP

50 篇文章 0 订阅

这个题题意很简单,一个背包容量为V,总共有n种物品,每种物品有对应的价值和容量:典型的01背包

那为什么这个题的通过率这么低呢?


因为题中的一句话:除了n的范围是不超过100,其余的所有数据是在【1,1e9】的

意味着体积也会是1e9的,那么就没办法开这么大的数组了


所以,脑洞:把map当成数组来搞

map中的第一个值为体积,第二个值为价值

第一维循环不变,仍然是枚举放入的是第几个物品

第二维循环遍历map中的所有元素就好


#include<bits/stdc++.h>
using namespace std;

#define LL __int64

int n,c;
struct Node{
    int w,v;
}node[1050];

map<LL,LL> dp,temp;
map<LL,LL>::iterator it;

int main(){
    while(scanf("%d%d",&n,&c)!=EOF){
        dp.clear();
        dp[0]=0;
        for(int i=1;i<=n;i++)
            scanf("%d%d",&node[i].w,&node[i].v);
        for(int i=1;i<=n;i++){
            temp.clear();
            for(it=dp.begin();it!=dp.end();it++){
                LL w,v;
                w=it->first;
                v=it->second;
                if (temp.find(w)==temp.end())
                    temp[w]=v;
                else
                    temp[w]=max(temp[w],v);
                if (w+node[i].w<=c&&temp[w+node[i].w]<v+node[i].v)
                    temp[w+node[i].w]=v+node[i].v;
            }
            LL MAX=-1;
            dp.clear();
            for(it=temp.begin();it!=temp.end();it++)
            if (it->second>MAX){
                dp[it->first]=it->second;
                MAX=it->second;
            }
            if (i==n) cout<<MAX<<endl;
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值