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