UVA301- Transportation

题意:有个城市,从起始站到末站,一共有n个车站。车的载客量是有限制的,有m个订单,要求运输企业的利润最大化,也就是说,订单要么一整个接受,要么拒绝

思路:利用DFS回溯,对于一个订单而言,要么接受,要么就是拒绝,记录每条订单的起始站到末站的人数,不能超过最大载客量

#include<stdio.h>
#include<string.h>

int p, num, order, max;
int cnt[100];

struct data{
    int s, e, per;
}a[50];

bool judge() {
    for(int i = 0; i < num; i++)
        if (cnt[i] > p)
            return false;
    return true;
}
 
void dfs(int d, int sum) {
    if (sum > max)
        max = sum;
    if (d >= order)
        return;
    for(int i = a[d].s; i < a[d].e; i++)
        cnt[i] += a[d].per;//记录载客量
    if (judge())
        dfs(d + 1, sum + (a[d].e - a[d].s) * a[d].per);
    for(int i = a[d].s; i < a[d].e; i++)
        cnt[i] -= a[d].per;
    dfs(d + 1, sum);
}

int main() {
    while (scanf("%d %d %d", &p, &num, &order) != EOF) {
        if (!p && !num && !order) 
            break;
        for(int i = 0; i < order; i++) 
            scanf("%d %d %d", &a[i].s, &a[i].e, &a[i].per); 
        memset(cnt, 0, sizeof(cnt));
        max = 0;
        dfs(0, 0);    
        printf("%d\n", max);
    }
    return 0;
}


你可能感兴趣的:(UVA301- Transportation)