Problem : 旅行

Problem : 旅行
Description
某趟列車的最大載客容量爲V人,沿途共有n個停靠站,其中始發站爲第1站,終點站爲第n站。在第1站至第n-1站之
間,共有m個團隊申請購票搭乘,若規定:(1)對於某個團隊的購票申請,要麼全部滿足,要麼全部拒絕,即不允
許只滿足部分。(2)每個乘客的搭乘費用爲其所乘站數。問:應如何選擇這些購票申請,能使該趟列車獲得最大
的搭乘費用?其中,每個團隊的購票申請格式是以空格分隔的三個整數:a b t,即表示有t個人需要從第a站點
乘至第b站點(注:每個團隊的所有人員都必須同時在a站上車,且必須同時在後面的b站下車)。

Input
有若干行。其中:
第1行只有三個整數n,m,v,分別表示站點數、申請數、列車的最大載客容量。
這三個整數之間都以一個空格分隔。
第2行至第m+1行,每行有三個整數,中間都以一個空格分隔。
其中第k+1行的三個整數a,b,t表示第k個申請,含義爲:有t個人需要從第a站乘至第b站。
1≤n≤10;1≤m≤18,1<=V<=200

Output
只有一行,該行只有一個整數,爲該列車能獲得的最大搭乘費用。

Sample Input
3 3 5
1 2 2
2 3 5
1 3 4
Sample Output
8
//當只選擇第3個申請時,能獲得的最大搭乘費用爲(3-1)*4=8

#include <bits/stdc++.h>
#define maxn 19
int n,m,v,ans;
int chafen[maxn],a[maxn],b[maxn],t[maxn];
bool exsit[maxn];
using namespace std;
bool cheak() //判斷是否超載
int total=0;
for(int i=1; i<=n; i++)
{
    total+=chafen[i];
    if(total>v)return 0;
}
return 1;
}    void dfs(int dep) //每個站點都是上或不上人,總共2^m種方案
{
    if(dep==m+1) {
        for(int i=1; i<=n; i++) chafen[i]=0; //初始化
        int temp=0;
        for(int i=1; i<=m; i++)             
        if(exsit[i]) {
                chafen[a[i]]+=t[i];//構造括號序列
                chafen[b[i]]-=t[i];
                temp+=(b[i]-a[i])*t[i];//計算當前方案總價錢
            }
        if(cheak())ans=max(ans,temp);//統計最大價錢
        return;
    }
    dfs(dep+1);
    exsit[dep]=1;//1代表上
    dfs(dep+1);
    exsit[dep]=0;//0代表不上
}
int main()
{
    scanf("%d%d%d",&n,&m,&v);
    for(int i=1; i<=m; i++)         
    scanf("%d%d%d",&a[i],&b[i],&t[i]);
    dfs(1);
    printf("%d\n",ans);
}
發佈了4 篇原創文章 · 獲贊 3 · 訪問量 6030
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章