POJ 2184 Cow Exhibition

来源:互联网 发布:unity3d opencv 编辑:程序博客网 时间:2024/05/16 08:52

无奈 无法独立解决

代码

//转化为01背包问题 就需要求状态转移方程,ff [ ] 下表设为 s[i]的值 其值设为f[i]的值,就是01pack的状态转移方程了#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#define PI acos(-1.0)#define max(a,b) (a)>(b)? (a):(b)#define min(a,b) (a)>(b)? (b):(a)#define INT_MIN -0x7FFFFFFF#define INT_MAX 0x7FFFFFFFint main(){    int i,j,k,n,ts,tf,ans;    int s[110],f[110],ff[200010];    int base=100000;    scanf("%d",&n);    for(i=0; i<n; i++)    {        scanf("%d%d",&s[i],&f[i]);    }    for(i=0; i<=200000; i++)        ff[i]=INT_MIN;    ff[base]=0;    for(i=0; i<n; i++)    {        if(s[i]<0 && f[i]<0) continue;        if(s[i]>0)        {            for(j=200000; j>=s[i]; j--)//为+则 逆序            {                if( ff[j-s[i]]>INT_MIN)                {                    ff[j]=max(ff[j],ff[j-s[i]]+f[i]);                }            }        }        else        {            for(j=s[i]; j<=200000+s[i]; j++)//为- 则顺序,这两处的循环方向其实都是为了只选择一次01pack            {                if(ff[j-s[i]]>INT_MIN)                {                    ff[j]=max(ff[j],ff[j-s[i]]+f[i]);                }            }        }    }    int ma=INT_MIN;    for(i=base; i<=200000; i++)    {        if(ff[i]>=0)        ma=max(ma,ff[i]+i-base);//+base    }    printf("%d\n",ma);    return 0;}

原创粉丝点击