#include <bits/stdc++.h>
using namespace std;
#define maxm 23
#define maxn 8
int cap, n, m;//cap表示容量,n表示站数,m表示订单数
int ans;//最后结果
int load[maxn];//表示在i站时车上的人数
struct Order {
int s, e, p;
} order[maxm];
int max(int a,int b) {
return a > b ? a: b;
}
bool operator < (const Order &a, const Order &b) {
if (a.s == b.s)
return a.e < b.e;
return a.s < b.s;
}
void dfs(int idx, int money) {//i:订单编号 money: 现在能赚的钱
if (idx == m) {
ans = max(ans, money);
return;
}
int ok = 1;
//判断可否接单
for(int j = order[idx].s; j < order[idx].e; ++j) {
if(load[j] + order[idx].p > cap) {
ok = 0;
break;
}
}
if (ok) {//可以接单
for(int j = order[idx].s; j < order[idx].e; ++j) {
load[j] += order[idx].p;
}
//接单开搞
dfs(idx + 1, money + order[idx].p * (order[idx].e - order[idx].s));
for(int j = order[idx].s; j < order[idx].e; ++j) {//恢复现场,以便后面的回溯
load[j] -= order[idx].p;
}
}
dfs(idx + 1, money);//没有接受第i个订单
}
int main() {
//freopen("data.in", "r", stdin);
int i;
while(cin >> cap >> n >> m, cap || n || m) {
for(i = 0; i < m; i++) {
scanf("%d%d%d", &order[i].s, &order[i].e, &order[i].p);
}
memset(load, 0, sizeof(load));
sort(order, order+m);
ans = 0;
dfs(0, 0);
printf("%d\n", ans);
}
return 0;
}
HDU 1456 Transportation(DFS)
最新推荐文章于 2021-02-03 12:33:34 发布