poj1404题解

来源:互联网 发布:算法实现约瑟夫环c语言 编辑:程序博客网 时间:2024/05/19 13:43

来源: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;}
0 0
原创粉丝点击