HDU 1456(Transportation)

深搜题,首先将各订单根据起点和终点排序,然后从前到后搜索,对于每个订单,判断列车容量能否接受,如果能接受,则更新赚的钱数,继续搜索下一个订单;如果不能接受,则跳过当前订单,搜索下一个订单。

#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;
}

继续加油。

发布了325 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Intelligence1028/article/details/105406870
hdu