标签:des style io ar color os sp for strong
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9429 | Accepted: 3624 |
Description
Input
Output
Sample Input
5 -5 7 8 -6 6 -3 2 1 -8 -5
Sample Output
8
Hint
原谅我的爱国,所以静不下心来看题,就直接在网上百度结题报告找题意,网上的基本都是模模糊糊,跟放屁一样。
题意:S和F分别是牛的两个属性,告诉你N头牛的这两个属性,然后要求你选出随意数量的牛,使得所有牛的S和F值加起来最大,同时所有牛的S值加起来不小于零,F值加起来也不小于零
解析:当作01背包来做的话就是把其中一个属性当作容量,这样下来,一定容量下得到的价值取最大就好了。
比如S当作容量,dp[X]的含义就成了:S值为X的时候F值最大量
但是S值有小于零的,这时我们考虑一下最小有多小就好做了,自己想吧!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[222222]; //最小是-10W,那么把整个数组留10W以上的空间给负数就好了
int main (void)
{
int n,m,i,j,k,l,a,b,x=111111; //x标记0的位置
int Max,Min; //最大最小边界,方便遍历已经求过值的范围里的数据
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<222222;i++)
{
dp[i]=-999999;
}
Max=Min=x;
dp[x]=0;
for(i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
if(a<0)
{
for(j=Min;j<=Max;j++) //负的要从小到大,01背包
{
if(dp[j+a]<dp[j]+b)
{
dp[j+a]=dp[j]+b;
}
}
Min+=a;
}else
{
for(j=Max;j>=Min;j--) //正的要从大到小,01背包
{
if(dp[j+a]<dp[j]+b)
{
dp[j+a]=dp[j]+b;
}
}
Max+=a;
}
}
l=0;
k=x;
while(k<=Max) //找所有S值大于零的组合
{
if(dp[k]>=0&&l<k-x+dp[k]) //F也大于零
{
l=k-x+dp[k];
}
k++;
}
printf("%d\n",l);
}
return 0;
}
POJ--2184--Cow Exhibition--01背包
标签:des style io ar color os sp for strong
原文地址:http://blog.csdn.net/jingdianitnan/article/details/41526355