标签:include tsp div ide 任务 display alt png long
题目如下:
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 }
标签:include tsp div ide 任务 display alt png long
原文地址:http://www.cnblogs.com/y119777/p/7560337.html