Ruratania只是指拥有资本的支配地位,并且在许多领域其中包括运输领域开展了许多新的创业活动。TransRuratania运输公司开设了从城市A到城市B的一个特快列车班次,路上有若干个停车站。这些车站接连着编号,城市A车站编号为0,城市B编号m。该公司为了提高收入开展了一个以提高客运能力为目的的实验。火车最大容客量为n。火车票的价格等于始发站和目的站(包括终点站)之间经过的火车站数,在火车从城市A出发前,就在客车经过的站点将车票订单收集起来,。来自车站S的车票订单说明所有车票都是从车站S到一个固定目的地(乘客从S站上车到乘车到其他站点)。为了防止由于客运能力的限制公司不能接受所有订单,其拒绝政策是完全是接受或完全拒绝一个站点的订单。
编写一个程序,求出由给定的A到B途中的单个车站的订单列表所决定了TransRuratania公司的可能的最大总收益。一个订单的收益是这个订单里的乘客数乘以票价。
第一行包括三个整数:火车的载客量城市,B站点编号,所有车站的车票订单数。每张车票的订单包括三个整数:起始站点终点站和乘客数。最多有22个订单。城市B的车站数 量最多是7
http://www.nocow.cn/index.php/%E9%A6%96%E9%A1%B5欢迎ACMer
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
int n,d,s,ans;
int begin[30],end[30],num[30],r[30];
int cmp(const void *_p,const void *_q)
{
int *p=(int *)_p;
int *q=(int *)_q;
return begin[*p]-begin[*q];
}
int dfs(int cur,int p[],int tot)
{
int i,j,t,q[30];
for(i=cur;i<d;i++)
if(num[r[i]]<=n-p[begin[r[i]]])
{
for(j=0;j<30;j++)
q[j]=p[j];
for(j=begin[r[i]];j<end[r[i]];j++)
q[j]+=num[r[i]];
t=tot+(end[r[i]]-begin[r[i]])*num[r[i]];
dfs(i+1,q,t);
}
if(i==d&&tot>ans)
ans=tot;
return 0;
}
int main()
{
int i,j,p[30],tot;
while(1)
{
scanf("%d%d%d",&n,&s,&d);
if(n==0)
break;
for(i=0;i<d;i++)
scanf("%d%d%d",&begin[i],&end[i],&num[i]);
for(i=0;i<d;i++)
r[i]=i;
qsort(r,d,sizeof(r[0]),cmp);
ans=0;
for(i=0;i<d;i++)
if(num[r[i]]<=n)
{
memset(p,0,sizeof(p));
for(j=begin[r[i]];j<end[r[i]];j++)
p[j]+=num[r[i]];
tot=(end[r[i]]-begin[r[i]])*num[r[i]];
dfs(i+1,p,tot);
}
printf("%d\n",ans);
}
return 0;
}