一看就是dp題,對於每頭牛,只有取和不取兩種情況,01揹包。
設f [ i ] 表示當智商之和爲 i 時情商之和最多是多少。
但智商之和有可能爲負數,那麼就加上一個常數。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 100005
struct node
{
int iq,eq;
}edge[150];
int n;
int f[maxn<<1+5];
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d %d",&edge[i].iq,&edge[i].eq);
}
for(int i=0;i<=(maxn<<1);i++)
{
f[i]=-maxn<<2;
}
f[maxn]=0;
for(int i=1;i<=n;i++)
{
if(edge[i].iq>=0)//注意體積的枚舉順序不同
{
for(int j=(maxn<<1)-1;j>=edge[i].iq;j--)
{
if(f[j-edge[i].iq]>-maxn<<2)
{
f[j]=max(f[j],f[j-edge[i].iq]+edge[i].eq);
}
}
}else
{
for(int j=edge[i].iq;j-edge[i].iq<(maxn<<1);j++)
{
if(f[j-edge[i].iq]>-maxn<<2)
{
f[j]=max(f[j],f[j-edge[i].iq]+edge[i].eq);
}
}
}
}
int ans=0;
for(int i=maxn;i<(maxn<<1);i++)
{
if(f[i]>=0)
{
ans=max(ans,f[i]+i-maxn);
}
}
printf("%d\n",ans);
}
}