poj 2184 Cow Exhibition(背包变形)

2014-11-23 23:21:22 · 作者: · 浏览: 5
这道题目和抢银行那个题目有点儿像,同样涉及到包和物品的转换。
我们将奶牛的两种属性中的一种当作价值,另一种当作花费。把总的价值当作包。然后对于每一头奶牛进行一次01背包的筛选操作就行了。
需要特别注意的是,当x小于0的时候,循环应该是正向的,不明白的话,好好想想01背包的一维解法为什么是逆向的。
#include
#include
#define MAX 99999999
#define N 201005
int dp[N];
int Max(int x,int y)
{
	if(x>y)
		return x;
	else
		return y;
}
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		int i;
		for(i=0;i
0) { for(i=200000;i>=x;i--) dp[i]=Max(dp[i],dp[i-x]+y); } else { for(i=0;i<=200000+x;i++) dp[i]=Max(dp[i],dp[i-x]+y); } } int max=-MAX; for(i=200000;i>=100000;i--) { if(dp[i]>=0) max=Max(max,dp[i]+i-100000); } if(max>0) printf("%d\n",max); else printf("0\n"); } return 0; }