bzoj 1222

比较简单的背包dp,设计状态f[i][j]表示到了前i个物品,第一台机器加工时间为j,第二台机器加工所用的最小时间,然后背包转移即可

本题卡空间,需要滚动数组优化

本题卡时间,稍微卡下常就行

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define uint unsigned int
using namespace std;
uint dp[2][60005];
uint n;
uint v1[6005],v2[6005],v3[6005];
inline uint read()
{
	uint f=1,x=0;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
uint min(uint x,uint y)
{
	return x<y?x:y;
}
uint max(uint x,uint y)
{
	return x>y?x:y; 
} 
int main()
{
	n=read();
	int s1=0;
	int s2=0;
	for(int i=1;i<=n;i++)
	{
		v1[i]=read(),v2[i]=read(),v3[i]=read();
		s1+=v1[i]+v3[i];
		s2+=v1[i]+v3[i];
	}
	if(s1<=s2)
	{
		memset(dp,0x3f,sizeof(dp));
		if(v1[1])
		{
			dp[0][v1[1]]=0;
		}
		if(v2[1])
		{
			dp[0][0]=v2[1];
		}
		if(v3[1])
		{
			dp[0][v3[1]]=min(dp[0][v3[1]],v3[1]);
		}
		int now=1,past=0;
		for(int i=2;i<=n;i++)
		{
			memset(dp[now],0x3f,sizeof(dp[now]));
			for(int j=0;j<=s1;j++)
			{
				if(j>=v1[i]&&v1[i])
				{
					dp[now][j]=min(dp[now][j],dp[past][j-v1[i]]);
				}
				if(j>=v3[i]&&v3[i])
				{
					dp[now][j]=min(dp[now][j],dp[past][j-v3[i]]+v3[i]);
				}
				if(v2[i])
				{
					dp[now][j]=min(dp[now][j],dp[past][j]+v2[i]);
				}
			}
			swap(now,past);
		}
		uint ans=0x3f3f3f3f;	
		for(int i=0;i<=s1;i++)
		{
			ans=min(ans,max(i,dp[past][i]));
		}
		printf("%u\n",ans);
		return 0;
	}else
	{
		memset(dp,0x3f,sizeof(dp));
		if(v1[1])
		{
			dp[0][0]=v1[1];
		}
		if(v2[1])
		{
			dp[0][v2[1]]=0;
		}
		if(v3[1])
		{
			dp[0][v3[1]]=min(dp[0][v3[1]],v3[1]);
		}
		int now=1,past=0;
		for(int i=2;i<=n;i++)
		{
			memset(dp[now],0x3f,sizeof(dp[now]));
			for(int j=0;j<=s2;j++)
			{
				if(j>=v1[i]&&v1[i])
				{
					dp[now][j]=min(dp[now][j],dp[past][j]+v1[i]);
				}
				if(j>=v3[i]&&v3[i])
				{
					dp[now][j]=min(dp[now][j],dp[past][j-v3[i]]+v3[i]);
				}
				if(v2[i])
				{
					dp[now][j]=min(dp[now][j],dp[past][j-v2[i]]);
				}
			}
			swap(now,past);
		}
		uint ans=0x3f3f3f3f;	
		for(int i=0;i<=s2;i++)
		{
			ans=min(ans,max(i,dp[past][i]));
		}
		printf("%u\n",ans);
		return 0;
	}
}

 

posted @ 2018-11-03 16:14  lleozhang  Views(124)  Comments(0Edit  收藏  举报
levels of contents