uva 301 Transportation

来源:互联网 发布:js设计模式是什么 编辑:程序博客网 时间:2024/04/29 19:18
#include<cstdio>#include<cstring>using namespace std;int n,m,k,seat[30],accept[30],max;typedef struct ord{    int start,end,number,earn;} ord;ord order[30];void dfs(int stop,int money,int cur){    max=max>money?max:money;    if(stop==m)  return ;    int i,j;    for(i=cur; i<k; i++)    {        if(order[i].start==stop&&!accept[i])        {            int flag=1;            for(j=stop; j<order[i].end; j++)                if(seat[j]<order[i].number)                {                    flag=0;                    break;                }            if(flag)            {                for(j=stop; j<order[i].end; j++)                    seat[j]-=order[i].number;                accept[i]=1;                dfs(stop,money+order[i].earn,i+1);                accept[i]=0;                for(j=stop; j<order[i].end; j++)                    seat[j]+=order[i].number;            }        }        else if(order[i].start>stop)   break;    }    dfs(stop+1,money,cur);}int main(){    //freopen("in.txt","r",stdin);    while(scanf("%d%d%d",&n,&m,&k)!=EOF&&(n||m||k))    {        for(int i=0; i<=m; i++)            seat[i]=n;        for(int i=0; i<k; i++)        {            scanf("%d%d%d",&order[i].start,&order[i].end,&order[i].number);            order[i].earn=(order[i].end-order[i].start)*order[i].number;            accept[i]=0;        }        for(int i=0; i<k; i++)        {            for(int j=i+1; j<k; j++)            {                if(order[i].start>order[j].start)                {                    ord temp;                    temp=order[i];                    order[i]=order[j];                    order[j]=temp;                }            }        }        max=0;        dfs(0,0,0);        printf("%d\n",max);    }    return 0;}
             代码是模仿别人的写的,主要还是回溯,然后在每一个stop站,可以选择让乘客上车,也可以选择不上,全局变量seat标记时时刻刻的车上的人数,用来判断能不能让乘客上车。dfs中stop是当前在哪一站,cur是当前执行的哪一个命令。暂时先写这些,再理解一下,争取自己重新写一个!
原创粉丝点击