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

评论