输入第一行,是车的限载人数 ,站点的数量 ,订单的数量。
接下来是每个订单的内容,从哪站 到 哪站 有几个人。
订单可以选择接或者不接,要求是不能超载,一个人一站是一块钱,问怎么接订单钱最多。。
首先先用一个结构体把订单存下来,然后开始回溯,用一个数组num记录到达每一站时的人数,然后一个一个订单遍历(注意不是一个一个站遍历)
判断是如果接了这个订单 ,比如这个订单是从1 - 3的。那么num[1] 也就是站点1现在的人数加上订单人数会不会超 num[2] num[3]也是,判断会不会超载,
如果都不会,就把钱加上,订单位置加一,递归,然后不接受订单的情况也递归(这时需要把每个站已经加上的人在减掉)。
AC代码:
#include <stdio.h>
struct order {
int s;
int e;
int people;
}ord[25];
int num[10];
int limit,m,n,max = 0;;
void search(int pos, int money) {
if(pos == m) {
if(max < money) max = money;
return;
}
int ok = 1;
int choose[10] = {0};
for(int i = ord[pos].s; i < ord[pos].e; i++) {
if( num[i] + ord[pos].people <= limit) {
num[i] += ord[pos].people;
choose[i] = 1;
}
else {
ok = 0;
break;
}
}
if(ok) {
search(pos + 1, money + (ord[pos].e-ord[pos].s) * ord[pos].people);
}
for(int i = 0; i <= n; i++)
if(choose[i])
num[i]-=ord[pos].people;
search(pos + 1,money);
}
int main () {
while(scanf("%d%d%d", &limit , &n , &m)) {
if (limit == 0)
break;
for(int i = 0; i < m; i++)
scanf("%d%d%d", &ord[i].s, &ord[i].e,&ord[i].people);
max = 0;
search(0, 0);
printf("%d\n",max);
}
return 0;
}