这个题题意很简单,一个背包容量为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;
}