正文

旅行2007-08-24 16:12:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/28810.html

分享到:

:::::旅 行::::: 描述 Description   某趟列车的最大载客容量为V人,沿途共有n个停靠站,其中始发站为第1站,终点站为第n站。在第1站至第n-1站之间,共有m个团队申请购票搭乘,若规定:(1)对于某个团队的购票申请,要么全部满足,要么全部拒绝,即不允许只满足部分。(2)每个乘客的搭乘费用为其所乘站数。问:应如何选择这些购票申请,能使该趟列车获得最大的搭乘费用?其中,每个团队的购票申请格式是以空格分隔的三个整数:a  b  t,即表示有t个人需要从第a站点乘至第b站点(注:每个团队的所有人员都必须同时在a站上车,且必须同时在后面的b站下车)。 输入格式 Input Format   输入有若干行。其中:第1行只有三个整数n,m,v,分别表示站点数、申请数、列车的最大载客容量。这三个整数之间都以一个空格分隔。第2行至第m+1行,每行有三个整数,中间都以一个空格分隔。其中第k+1行的三个整数a,b,t表示第k个申请,含义为:有t个人需要从第a站乘至第b站。其中:1≤n≤10;1≤m≤18 输出格式 Output Format   输出只有一行,该行只有一个整数,为该列车能获得的最大搭乘费用。   //////  江南孤峰  按站点上车的先后排序团体,递归搜索最优解,在 a 团体上车时车上能够容下的人数记得减掉到站的团体人数。。。。 #include <iostream>using namespace std; typedef struct node{ int a,b,t; bool s;}NODE;NODE gGroup[20]; int myCmp(const void *a, const void *b){  // 用于排序 if(((NODE*)a)->a > ((NODE*)b)->a)  return 1; else if(((NODE*)a)->a < ((NODE*)b)->a)  return -1; return 0;}int get(int s,int e,int t){    // 深搜 int sum,i,j,max; NODE grp[20]; memcpy(grp,gGroup,sizeof(NODE)*s); for(i=s,sum=0,max=0; i<e; i++){  for(j=0; j<s; j++){   // 减掉到站人数   if(gGroup[j].s && gGroup[j].b <= gGroup[i].a){    t += gGroup[j].t;    gGroup[j].s = false;   }  }  if(gGroup[i].t<=t){   gGroup[i].s = true;   sum = (gGroup[i].b-gGroup[i].a)*gGroup[i].t+get(i+1,e,t-gGroup[i].t);   if(sum > max)    max = sum;   gGroup[i].s = false;  } } memcpy(gGroup,grp,sizeof(NODE)*s); return max;}int main(){  int n,m,v,i,dp[20]={0}; cin>>n>>m>>v; for(i=0; i<m; i++){  cin>>gGroup[i].a>>gGroup[i].b>>gGroup[i].t;  gGroup[i].s = false; } qsort(gGroup,m,sizeof(NODE),myCmp);  // 排序 cout<<get(0,m,v)<<endl;     return 0;}

阅读(3142) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册