题目描述:有N头奶牛想参加CJ,每头奶牛的智商分别为S_i,情商为F_i。欲挑出一群奶牛使得S之和与F之和都不为负数,且SF之和最大,求此最大值
题解:01背包,把S看成包重,F看成价值。注意C中没有下标为负的数组,只好将数组右移足够大的单位,注意要分S的正负讨论。
参考程序:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int f[1000*100*2+26];
int w[120],v[120];
int main(){
int n;
scanf("%d",&n);
int center=1000*n;
int M=2*center+20;
for (int i=0;i<n;i++)
scanf("%d %d",&w[i],&v[i]);
memset(f,0x80,sizeof(f));
f[center]=0;
for (int i=0;i<n;i++)
if (w[i]>=0)
for (int j=M;j>=w[i];j--)
f[j]=max(f[j],f[j-w[i]]+v[i]);
else
for (int j=0;j-w[i]<M;j++)
f[j]=max(f[j],f[j-w[i]]+v[i]);
int ans=-M;
for (int i=center;i<M;i++)
if (f[i]>=0)
ans=max(ans,i-center+f[i]);
printf("%d",ans);
return 0;
}