您的位置:首页 > 其它

POJ 2184 Cow Exhibition

2013-07-22 11:04 246 查看
无奈 无法独立解决

代码//转化为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 0x7FFFFFFF
int 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: