程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj 2184 Cow Exhibition(背包變形)

poj 2184 Cow Exhibition(背包變形)

編輯:C++入門知識

這道題目和搶銀行那個題目有點兒像,同樣涉及到包和物品的轉換。   我們將奶牛的兩種屬性中的一種當作價值,另一種當作花費。把總的價值當作包。然後對於每一頭奶牛進行一次01背包的篩選操作就行了。   需要特別注意的是,當x小於0的時候,循環應該是正向的,不明白的話,好好想想01背包的一維解法為什麼是逆向的。

#include<stdio.h>
#include<string.h>
#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<N;i++)
			dp[i]=-MAX;
		dp[100000]=0;
		while(n--)
		{
			int x,y;
			scanf("%d%d",&x,&y);
			if(x<0&&y<0)
				continue;
			else if(x>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;
}

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved