RT
为什么要平移那么大的数,不能直接将每个数加上 1000,这样每个数就非负数了,然后再做 01 背包,有哪里错了吗?(虽然答案错了)
代码如下
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 110;
int iq[maxn],eq[maxn];
int f[maxn*30];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d %d",&iq[i],&eq[i]),iq[i]+=1000,eq[i]+=1000;
// memset(f,-0x3f,sizeof(f));
for(int i=1;i<=n;i++)
for(int j=2000;j>=iq[i];j--)
f[j] = max(f[j],f[j-iq[i]]+eq[i]);
int ans = -1000;
for(int i=1;i<=2000;i++){
ans = max(ans,i+f[i]-2000);
// cout<<f[i]<<endl;
}
cout<<ans<<endl;
return 0;
}