深搜题,首先将各订单根据起点和终点排序,然后从前到后搜索,对于每个订单,判断列车容量能否接受,如果能接受,则更新赚的钱数,继续搜索下一个订单;如果不能接受,则跳过当前订单,搜索下一个订单。
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXM = 25;
const int MAXN = 10;
int cap, n, m; //容量,站数,订单数
int people[MAXN]; //各站时车上的人数
int ans; //输出
struct Order //订单
{
int st, ed; //起点,终点
int num; //人数
} order[MAXM];
//排序方式
bool cmp(Order o1, Order o2)
{
if (o1.st != o2.st)
return o1.st < o2.st;
else
return o1.ed < o2.ed;
}
//深搜,搜索赚钱数的最大值
//idx:订单编号,money: 目前赚的钱数
void DFS(int idx, int money)
{
if (idx == m) //搜索完所有订单
{
ans = max(ans, money);
return;
}
int flag = 1; //判断能否接单
for (int i = order[idx].st; i < order[idx].ed; i++)
{
if (people[i] + order[idx].num > cap) //人数超过容量,无法接单
{
flag = 0;
break;
}
}
if (flag) //可以接单
{
for (int i = order[idx].st; i < order[idx].ed; i++) //更新各站时车上的人数
{
people[i] += order[idx].num;
}
//接受当前订单,更新赚的钱数,继续搜索下一个订单
DFS(idx + 1, money + order[idx].num * (order[idx].ed - order[idx].st));
for (int i = order[idx].st; i < order[idx].ed; i++) //回溯
{
people[i] -= order[idx].num;
}
}
DFS(idx + 1, money); //没有接受当前订单,搜索下一个订单
}
int main()
{
while (cin >> cap >> n >> m)
{
if (cap == 0 && n == 0 && m == 0)
break;
for (int i = 0; i < m; i++) //输入各订单信息
{
cin >> order[i].st >> order[i].ed >> order[i].num;
}
sort(order, order + m, cmp);
memset(people, 0, sizeof(people));
ans = 0;
DFS(0, 0);
cout << ans << endl;
}
return 0;
}
继续加油。