| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 9564 | Accepted: 3690 |
Description
Input
Output
Sample Input
5 -5 7 8 -6 6 -3 2 1 -8 -5
Sample Output
8
Hint
allowed.
给出n个牛的聪明值和幽默值,在这些牛里选出部分牛,使选出牛的聪明值和幽默值得和最大,聪明值的和和幽默值的和都不能为负数
将聪明值看成容积,幽默值看成价值,用01背包,但是出现了负数,dp[i]代表体积,将其整体平移100000就可解决了,另外当聪明值为负值时,要从小到大进行背包才能保证每个只用了一次。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=200000+100;
const int inf=1<<30;
int dp[maxn];
int main()
{
int n;
while(~scanf("%d",&n))
{
int u,v;
for(int i=0;i<maxn;i++)
dp[i]=-inf;
dp[100000]=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&u,&v);
if(u<0&&v<0)
continue;
if(u>0)
for(int j=200000;j>=u;j--)
{
if(dp[j-u]>=-inf)
dp[j]=max(dp[j-u]+v,dp[j]);
}
else
{
for(int j=u;j<=200000+u;j++)
{
if(dp[j-u]>=-inf)
dp[j]=max(dp[j-u]+v,dp[j]);
}
}
}
int ans=0;
for(int i=100000;i<=200000;i++)
if(dp[i]>=0)
ans=max(ans,dp[i]+i-100000);
printf("%d\n",ans);
}
return 0;
}
原文地址:http://blog.csdn.net/caduca/article/details/43305791