transportation -- DFS

来源:https://blog.csdn.net/CrazyForsaken/article/details/78690524

题目描述

Ruratania刚刚进入资本主义,正在包括运输在内的许多领域建立新的进取活动。TransRuratania运输公司正在开始从A市到B市的新特快列车,在途中的车站有几站。站点连续编号,城市A站号码为0,城市B站号码为m。该公司进行了一项试验,以提高客运能力,从而增加其收益。列车有最多的乘客能力。火车票的价格等于起始站和目的站(包括目的站)之间的站点(站)的数量。在火车开始从A市的路线之前,从所有路线上的车站收集订单。来自S站的订单表示从S到固定目的地站的所有票的预订。如果公司由于旅客容量限制而无法接受所有订单,其拒收政策是完全接受或完全拒绝来自单个工作站的单个订单。 
编写一个程序,对于从A到B的单站的给定订单列表,确定TransRuratania公司的最大可能总收入。一个接受订单的收入是订单中包含的乘客数量和火车票价格的乘积。总收入是所有接受订单收入的总和。 

输入

输入文件分为块。每个区块的第一行包含三个整数:列车的乘客容量n,城市B站的数量和所有车站的票单数量。下一行包含票据订单。每个票证订单包含三个整数:起始站,目的地站,乘客数量。在一个区块中,最多可以有22个订单。城市B站的数量最多为7个。第一行中所有三个数字均等于零的块表示输入文件的结尾。

输出

输出文件由与输出文件的块相对应的行组成,但终止块除外。每条这样的行包含最大可能的总收入。

样例输入

10 3 4
0 2 1
1 3 5
1 2 7
2 3 10
10 5 4
3 5 10
2 4 9
0 2 5
2 5 8
0 0 0

样例输出

19
34
算法实现:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
struct EO//存储订单 
{
    int bgn;
    int nd;
    int number;
} ar[205];
int ans;
int maxpeople, station, order;
int sum[205];
void dfs(int numEO, int money)
{
    ans=max(ans,money);
    if(numEO==order)//判断是否已经受理了order个订单,结束 
        return;
    dfs(numEO+1,money); // 不接受当前订单 
    bool bul=1;
    for(int i=ar[numEO].bgn;i<ar[numEO].nd;i++)//判断是否超载  
    {
        sum[i]+=ar[numEO].number;
        if(sum[i]>maxpeople)
            bul=0;
    }
    if(bul)//接受当前订单
    {
        dfs(numEO+1,money+(ar[numEO].nd-ar[numEO].bgn)*ar[numEO].number); 
    }
    for(int i=ar[numEO].bgn;i<ar[numEO].nd;i++)//还原上一层sum的人数 
    {
        sum[i]-=ar[numEO].number;
    } 
}
int main()
{
    while(cin>>maxpeople>>station>>order&&maxpeople+station+order>0)
    {
        ans = 0;
        memset(sum,0,sizeof(sum));
        for(int i=0;i<order;i++)
        {
            cin>>ar[i].bgn>>ar[i].nd>>ar[i].number;
        }
        dfs(0,0);
        cout<<ans<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值