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