传送门(洛谷)
f [ i ] 表 示 当 智 商 为 i 时 , 情 商 最 高 为 多 少 f[i]表示当智商为i时,情商最高为多少 f[i]表示当智商为i时,情商最高为多少
具体类似讲解请移步我的另一篇博客
Code
#include<bits/stdc++.h>
#define rep(i,a,b) for(register int (i)=(a);(i)<=(b);(i)++)
#define don(i,a,b) for(register int (i)=(a);(i)>=(b);(i)--)
using namespace std;
const int maxn=8e5+10;
const int maxm=1e3+10;
int n;
int f[maxn];
template <class t> inline void read(t &x) {
int f=1;x=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=10*x+ch-'0';ch=getchar();}
x*=f;
}
struct node{
int IQ,EQ;
}a[405];
void readdata()
{
read(n);
rep(i,1,n) {
read(a[i].IQ);
read(a[i].EQ);
}
}
void work()
{
memset(f,-0x3f,sizeof(f));
f[400000]=0;
rep(i,1,n) {
if(a[i].EQ>=0) {
don(j,800000,a[i].EQ) {
f[j]=max(f[j],f[j-a[i].EQ]+a[i].IQ);
}
}
else {
rep(j,0,800000+a[i].EQ) {
f[j]=max(f[j],f[j-a[i].EQ]+a[i].IQ);
}
}
}
int ans=-INT_MAX;
rep(i,400000,800000) {
if(f[i]>=0)
ans=max(ans,f[i]+i-400000);//这儿减400000是因为你最后求的是情商和智商的总值,而之前我们为了避免数组越界把智商右移了400000
}
printf("%d\n",ans);
}
int main()
{
freopen("input.txt","r",stdin);
readdata();
work();
return 0;
}