《DFS》Problem A. 旅行

Problem A. 旅行

时间限制 1000 ms
内存限制 128 MB

题目描述

某趟列车的最大载客容量为V人,沿途共有n个停靠站,其中始发站为第1站,终点站为第n站。
在第1站至第n-1站之间,共有m个团队申请购票搭乘,若规定:
(1)对于某个团队的购票申请,要么全部满足,要么全部拒绝,即不允许只满足部分。(2)每个乘客的搭乘费用为其所乘站数。问:应如何选择这些购票申请,能使该趟列车获得最大的搭乘费用?
其中,每个团队的购票申请格式是以空格分隔的三个整数:a b t,即表示有t个人需要从第a站点乘至第b站点(注:每个团队的所有人员都必须同时在a站上车,且必须同时在后面的b站下车)。

输入数据

输入文件travel.in中有若干行。其中:
第 $1$ 行只有三个整数 $n, m, v,$ 分别表示站点数、申请数、列车的最大载客容量。这三个整数之间都以一个空格分隔。
第 $2$ 行至第 $m+1$ 行,每行有三个整数,中间都以一个空格分隔。其中第 $k+1$ 行的三个整数 $a, b, t$ 表示第 $k$ 个申请,含义为:有 $t$ 个人需要从第 $a$ 站乘至第 $b$ 站。
其中 $:1≤n≤10; 1≤m≤18$

输出数据

输出文件travel.out中只有一行,该行只有一个整数,为该列车能获得的最大搭乘费用。

样例输入

3  3  5
1  2  2
2  3  5
1  3  4

样例输出

8

思路解析: 

对每一个团队进行使用团队和不使用团队进行遍历,最后进行条件判断,符合条件,则和ans比较,如果大于ans,则更新ans。

为什么敢用暴力? m<=18 所以遍历总数只为2^18=1024*256=262144(次)  再加上操作 为262144*18=4718592次,一般1s大概可以运行1千万次左右,不会超时。

AC代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<cmath>
#define INF 0x7FFFFFFF //int 最大值
#define nSize 10
#define mSize 18
using namespace std;
//dfs;
int n,m,v;
int ans=0;
int change[nSize+5]={0}; //每站增加或减少乘客数量。
bool isUsed[mSize+5];

struct Team{//每个队伍
    int startStop;
    int endStop;
    int pNum;
};
Team team[mSize+5];

bool isOversize()//判断是否超载。
{
    int sum=0;
    for(int i=0;i<n;i++)
    {
        sum+=change[i];
        if(sum>v)
            return true;
    }
    return false;
}

void dfs(int i)//暴力
{
    if(i==m)
    {
        int currentSum=0;
        memset(change,0,sizeof(change));
        for(int i=0;i<m;i++)
        {
            if(isUsed[i])
            {
                change[team[i].startStop]+=team[i].pNum;
                change[team[i].endStop]-=team[i].pNum;
                currentSum+=((team[i].endStop-team[i].startStop)*team[i].pNum);
            }
        }
        //cout<<currentSum<<endl;
        if(!isOversize())
            ans=max(currentSum,ans);
        return ;
    }
    //cout<<i<<endl;
    isUsed[i]=true;
    dfs(i+1);
    isUsed[i]=false;//回溯
    dfs(i+1);
}



int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m>>v;

    for(int i=0;i<m;i++)
        cin>>team[i].startStop>>team[i].endStop>>team[i].pNum;

    ans=0;
    memset(isUsed,false,sizeof(isUsed));
    dfs(0);

    cout<<ans<<endl;
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值