BZOJ1222: [HNOI2001]产品加工

本文通过一个具体的编程问题,详细介绍了如何使用动态规划解决复杂的任务分配问题。文章中包含了一个完整的C++代码示例,解释了如何计算两个不同机器处理一系列任务时所需的最短时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                                                                                            题目传送门

题解 : 一个奇怪的dp 要说的都写在代码里了

#include<bits/stdc++.h>
#define ll long long
const int INF = 0x7fffffff;
const int mx = 30005;
const double eps = 1e-5;
using namespace std;
int read()
{
	int x = 0 , f = 1; 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;
}
//f[i]这个状态表示a机器花了i分钟,b机器花了f[i]分钟  好奇怪的状态... 
int n,m,f[30001],a[6001],b[6001],c[6001];
int main()
{
	n = read();
	for(int i = 1 ; i <= n ; i++)
	{
		a[i] = read(),b[i] = read(),c[i] = read();
		if(!a[i]) a[i] = mx; if(!b[i]) b[i] = mx; if(!c[i]) c[i] = mx;	
		int t = mx;
		t = min(min(t,min(a[i],b[i])),c[i]);//t是第x个部件需要的最少时间 
		m += t;//m是需要的最少时间的总和 
	}
	for(int i = 1 ; i <= n ; i++)
	{
		for(int j = m ; j >= 0 ; j--)
		{	
			int t = mx;
			if(j - a[i] >= 0)
				t = min(t,f[j-a[i]]);
			t = min(t,f[j]+b[i]);
			if(j - c[i] >= 0)
				t = min(t,f[j-c[i]]+c[i]);
			//由上面描述的转移方程可得  三种情况全部转移一下就是最优解 
			f[j] = t;
		}
	}
	int ans = mx;
	for(int i = 0 ; i <= m ; i++)	ans = min(ans,max(i,f[i]));//二取一大中取小 
	printf("%d",ans);
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值