HDU 1456 Transportation(DFS)
阿新 • • 發佈:2019-01-08
#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; }