来源:http://poj.org/problem?id=1040
思路:dfs
代码:
#include <stdio.h>
#include <string.h>
int z,n,m,s[30],t[30],w[30],e[30],g[8],max;
//s,t数组分别记录订单的起点和终点,w数组记录订单的人数,e数组记录订单的利润,g数组记录第i个车站的人数
void dfs(int dep,int p)//搜索dep个订单,此时的利润为p
{
int i;
if(p>max) max=p;
if(dep>=m) return;
for(i=s[dep];i<t[dep];i++)
if(g[i]+w[dep]>z) break;
//如果i>=t[dep]则说明第s到t原有的人数加上第dep个订单的人数不大于载客量
if(i>=t[dep])
{
for(i=s[dep];i<t[dep];i++)
g[i]+=w[dep];
dfs(dep+1,p+e[dep]);
for(i=s[dep];i<t[dep];i++)
g[i]-=w[dep];
}
dfs(dep+1,p);
}
int main()
{
while(scanf("%d%d%d",&z,&n,&m),z||n||m)
{
memset(g,0,sizeof(g));
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&s[i],&t[i],&w[i]);
e[i]=w[i]*(t[i]-s[i]);
}
max=0;//储存最大利润
dfs(0,0);
printf("%d\n",max);
}
return 0;
}
本文介绍了一个使用深度优先搜索(DFS)算法解决的最大利润问题。该问题来源于POJ在线评测系统的一个题目,核心任务是在考虑车辆载客量限制的前提下,通过合理的乘客上下车安排来实现最大化的盈利目标。
1511

被折叠的 条评论
为什么被折叠?



