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是当前执行的哪一个命令。暂时先写这些,再理解一下,争取自己重新写一个!