CF 1042B. Vitamins(状压dp)

以此题开始进入学习状压dp~

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int dp[8], tmp, n, c;
 9     string s;
10     cin >> n;
11     for (int i = 0; i <= 7; i++) dp[i] = 0x3f3f3f3f;
12     for (int i = 0; i < n; i++) {
13         tmp = 0;
14         cin >> c >> s;
15         for (int j = 0; j < s.size(); j++) {
16             if (s[j] == 'A') tmp |= 1;
17             if (s[j] == 'B') tmp |= 2;
18             if (s[j] == 'C') tmp |= 4;
19         }
20         dp[tmp] = min(dp[tmp], c);
21     }
22     for (int i = 0; i <= 7; i++)
23         for (int j = 0; j <= 7; j++)
24             dp[i | j] = min(dp[i | j], dp[i] + dp[j]);
25     if (dp[7] < 0x3f3f3f3f) cout << dp[7] << endl;
26     else cout << -1 << endl;
27 }

猜你喜欢

转载自www.cnblogs.com/komorabi/p/10671906.html
今日推荐