首页 > 试题广场 >

旅行Ⅱ

[编程题]旅行Ⅱ
  • 热度指数:753 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
牛妹出去旅行啦,她准备去个城市旅行,去每个城市的开销是元。但是牛妹有强迫症,她想在去y城市之前先旅游x城市,于是牛妹列出了这些限制条件List。并且牛妹很节约,她只有元,她想知道她最多能到多少个城市去旅游。
示例1

输入

3,10,[3,7,8],[(1,2)]

输出

2

说明

先去1号城市再去2号城市,花费为 3+7=10

备注:
A[0]代表1号城市的开销
A[1]代表2号城市的开销,以此类推



#include <bits/stdc++.h>
using namespace std;

struct Point {
	int x;
	int y;
};

class Solution {
public:
    /**
     * 
     * @param N int整型 N
     * @param V int整型 V
     * @param A int整型一维数组 A
     * @param ALen int A数组长度
     * @param List Point类vector List
     * @return int整型
     */
    vector<int> G[21];
    int Max = 0;
    bool dp[1<<20];
    void DFS(int s, int N, int V, int *A, int cnt){
        if(dp[s])
            return;
        dp[s] = true;
        Max = max(Max, cnt);
        for(int i=0;i<N;i++){
            if(!(s & (1<<i)) && A[i]<=V){
                bool f = true;
                for(auto &v: G[i]){
                    if(!(s & (1<<v))){
                        f = false;
                        break;
                    }
                }
                if(f)
                    DFS(s|(1<<i), N, V-A[i], A, cnt+1);
            }
        }
    }
    int Travel(int N, int V, int* A, int ALen, vector<Point>& List) {
        for(auto &p: List)
            if(p.x!=p.y)
                G[p.y-1].push_back(p.x-1);
        DFS(0, N, V, A, 0);
        return Max;
    }
};

int main(){
    vector<Point> L;
    L.push_back({1,2});
    int A[3] = {3, 7, 8};
    Solution solution;
    cout<<solution.Travel(3, 10, A, 3, L)<<endl;
    return 0;
}

发表于 2020-08-25 15:01:21 回复(0)

问题信息

难度:
1条回答 5209浏览

热门推荐

通过挑战的用户

查看代码