以此题开始进入学习状压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 }