Sora
Table_bottom

分类
Table_bottom

最新评论
Table_bottom

最新留言
Table_bottom

链接
Table_bottom

RSS
RSS Link
Table_bottom

功能
Table_bottom

ZJUT1476 礼物放置

Sora posted @ 2011年4月24日 20:58 in DP , 607 阅读
#include <cstdio>
int maxone(int a, int b){return a<b?b:a;}

int f[11000];
int back[11000];

int main()
{
	int n;
	while (scanf("%d",&n)!=EOF)
	{
		int i,j;
		int gift[110],cou=0;
		int mid = 0;
		for (i=0;i<n;i++)
		{
			scanf("%d",gift+i);
			mid += gift[i];
		}
		for (i=0;i<=mid;i++)
		{
			f[i] = -1;
			back[i] = -1;  //没重置错误了很多次
		}
		f[0] = 0;
		for (j=0;j<n;j++)
		{
			int _cou = cou;
			for (i=0;i<=cou;i++)
			{
				back[i]=f[i];
			}
			for (i=0;i<=cou;i++)
			{
				if (f[i] >= 0)
				{
					if (i + gift[j] <= mid)
					{
						back[i+gift[j]] = maxone(f[i]+gift[j],back[i+gift[j]]);
						_cou = maxone(i+gift[j], cou);
					}
					if (i >= gift[j])
					{
						back[i-gift[j]] = maxone(back[i-gift[j]], f[i]);
					}
				}
			}
			for (i=0;i<=_cou;i++)
			{
				f[i]=back[i];
			}
			cou = _cou;
		}
		if (f[0] == 0) printf("-1\n"); else printf("%d\n",f[0]);
	}
	return 0;
}

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter