正文

旅行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;
}

阅读(3012) | 评论(0)


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

评论

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