题目说要在规定时间内,拿走最大价值。因为房间n <= 10  太小了,所以直接枚举 走过哪几个房间,然后dp 递推下去就可以了

dp[i][j] 走过i状态的房间,现在在第j个房间上面花费的最小时间。

View Code
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 #define N 12
 8 #define M 110
 9 #define inf 1000000000
10 typedef long long LL;
11 int v[N], val[1<<N];
12 struct node {
13     int v, next, l;
14 }e[M];
15 int mpp[N][N], dp[1<<N][N];
16 int main() {
17     int n, m, t, s, e;
18     while (scanf("%d%d%d", &n, &m, &t) != EOF) {
19         scanf("%d%d", &s, &e);
20         for (int i = 0; i < n; ++i) {
21             scanf("%d", &v[i]);
22             for (int j = 0; j < n; ++j)
23                 mpp[i][j] = inf;
24             mpp[i][i] = 0;
25         }
26 
27         for (int i = 0; i < 1<<n; ++i) {
28             for (int j = 0; j < n; ++j)
29                 dp[i][j] = inf;
30             val[i] = 0;
31             int temp = i, k = 0;
32             while (temp) {
33                 if (temp&1) val[i] += v[k];
34                 k++;
35                 temp >>= 1;
36             }
37         }
38 
39         while (m--) {
40             int a, b, c;
41             scanf("%d%d%d", &a, &b, &c);
42             mpp[a][b] = mpp[b][a] = min(mpp[a][b], c);
43         }
44         for (int k = 0; k < n; ++k) for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j)
45             mpp[i][j] = min(mpp[i][j], mpp[i][k]+mpp[k][j]);
46         dp[1<<s][s] = 0;
47         for (int i = 1; i < 1<<n; ++i) {
48             for (int j = 0; j < n; ++j) {
49                 if (dp[i][j] > t) continue;
50                 for (int k = 0; k < n; ++k) {
51                     int state = i|1<<k;
52                     dp[state][k] = min(dp[state][k], mpp[j][k]+dp[i][j]);
53                 }
54             }
55         }
56         int ans = 0;
57         for (int i = 1; i < 1<<n; ++i)
58             if (dp[i][e] <= t)
59                 ans = max(val[i], ans);
60         printf("%d\n", ans);
61     }
62     return 0;
63 }

相关文章:

  • 2021-07-02
  • 2021-05-26
  • 2022-03-06
  • 2021-06-07
  • 2021-07-16
  • 2021-12-01
  • 2021-12-19
  • 2021-11-18
猜你喜欢
  • 2021-09-24
  • 2021-06-15
  • 2022-02-16
  • 2021-12-14
  • 2021-10-04
  • 2021-11-15
相关资源
相似解决方案