題目比較難理解。
給出鐵路的容量和站點數,以及幾筆訂單,要求算出如何盈利最大。
咋一看想貪心,但無法確定是最優解啊。
於是用dfs做,就兩種狀況,選與不選,先開一個每個站點的當前人數數組,假設要選,然後各個站點加上人數判斷會不會超人數,不會就進入選擇的下一輪dfs,然後把人數減掉,進入不選的dfs。
這題據說用數組標記會超時。。。
代碼:
#include <cstdio>
const int maxn = 30;
int cap, num, ord, ans;
int cnt[10];
struct Order {
int s;
int e;
int p;
};
Order o[maxn];
bool judge() {
for (int i = 0; i < num; i++)
if (cnt[i] > cap)
return false;
return true;
}
void dfs(int d, int sum) {
if (sum > ans) ans = sum;
if (d >= ord) return;
for (int i = o[d].s; i < o[d].e; i++)
cnt[i] += o[d].p;
if (judge()) //choose
dfs(d + 1, sum + o[d].p * (o[d].e - o[d].s));
for (int i = o[d].s; i < o[d].e; i++)
cnt[i] -= o[d].p;
dfs(d + 1, sum); //not choose
}
int main() {
while (scanf("%d%d%d", &cap, &num, &ord) && (cap || num || ord)) {
for (int i = 0; i < num; i++)
cnt[i] = 0;
for (int i = 0; i < ord; i++)
scanf("%d%d%d", &o[i].s, &o[i].e, &o[i].p);
if (!cap || !num || !ord) {
printf("0\n");
continue;
}
ans = 0;
dfs(0, 0);
printf("%d\n", ans);
}
return 0;
}