• 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
    ",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
    ",ans);
    		return 0;
    	}
    }
  • 相关阅读:
    解决uniapp中app.vue的onlaunch不能跳转页面问题
    参数校验注解,备用
    码云推送项目总是没有权限
    一句话解释回调函数
    动态管理
    转:用jupyter notebook打开指定目录下的.ipynb文件
    gcn变体
    图4
    节点分类
    图3
  • 原文地址:https://www.cnblogs.com/zhangleo/p/10764146.html
Copyright © 2020-2023  润新知