为什么 dp 数组要平移 400000
查看原帖
为什么 dp 数组要平移 400000
392380
distant_skys楼主2021/8/21 12:47

RTRT

为什么要平移那么大的数,不能直接将每个数加上 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;
}
2021/8/21 12:47
加载中...