UVA_301
我们可以取一个数组p来记录列车到每一站时最多能容纳的乘客量,之后对输入的数据按起始车站升序排列,然后按顺序枚举每一个订单。如果当前订单的乘客量小于或等于列车到该站时能容纳的乘客量,则该订单可以被接受,更新p并进行递归即可。
#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;
}
int main()
{
int i,j,k,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;
}