幸福指数

题目如下:

a

看完题目没有想法,记得leetcode上面有一道也是相同的输入,但是求解的是最大任务完成数量,好像是set模拟的,但是这个题目是所有的任务,

都要完成,暴力的复杂度是15!,复杂度比较高,也没有贪心的性质,一直不会做。

后来在大神师弟的指导下:

他这么说:状压, 用一个2^15, dp[n]表示当前n对应二进制位1都完成了的最大幸福值, 然后和tsp差不多转移一下就行了。

我不是很懂tsp转移,然后大概写了一下自己的理解,这个题目也无从提交判断正误,只能这样了。

 1 #include<bits/stdc++.h>
 2 #define pb push_back
 3 typedef long long ll;
 4 using namespace std;
 5 typedef pair<int, int> pii;
 6 const int maxn = 1e3 + 10;
 7 
 8 int t[20], d[20];
 9 int n;
10 int dp[1 << 16];
11 bool in[1 << 16];
12 void solve() {
13     cin >> n;
14     for (int i = 0; i < n; i++) {
15         cin >> t[i] >> d[i];
16     }
17     queue<int> q;
18     q.push(0);
19     while(!q.empty()) {
20         int u = q.front(); q.pop();
21         in[u] = 0;
22         int s = 0;
23         for (int i = 0; i < n; i++) {
24             if(u & (1 << i)) s += t[i];
25         }
26         for (int i = 0; i < n; i++) {
27             if(u & (1 << i)) continue;
28             int v = dp[u] + 100;
29             if(s + t[i] > d[i]) {
30                 v -= s + t[i] - d[i];
31             }
32             int d = u | (1 << i);
33             if(v > dp[d]) {
34                 if(!in[d]) {
35                     in[d] = 1;
36                     q.push(d);
37                 }
38                 dp[d] = v;
39             }
40          }
41     }
42     cout << dp[(1 << n) - 1] << endl;
43 }
44 
45 int main() {
46     freopen("test.in", "r", stdin);
47     //freopen("test.out", "w", stdout);
48     solve();
49     return 0;
50 }
View Code
原文地址:https://www.cnblogs.com/y119777/p/7560337.html