[백준 2961번 C/C++] 도영이가 만든 맛있는 음식
[백준 2961번 C/C++] 도영이가 만든 맛있는 음식

https://www.acmicpc.net/problem/2961
해결전략
비트마스킹 Bitmasking
처음 시도한 코드 - 시간초과
#include <iostream> #include <set> #include <vector> using namespace std; int n; long long answer = 987654321; vector<int> sour, bitter; vector<pair<int, int>> taste; void DFS(int idx, vector<int>& ch, set<int>& foods) { if (idx == n){ long long sour = 1, bitter = 0; for (auto& iter : foods){ sour *= taste[iter].first; bitter += taste[iter].second; } answer = min(answer, abs(sour - bitter)); return; } for (int i = 0; i < n; i++) { if (ch[i] == 0) { ch[i] = 1; foods.insert(i); DFS(idx + 1, ch, foods); foods.erase(i); ch[i] = 0; } } } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; taste.resize(n); for (int i = 0; i < n; i++){ cin >> taste[i].first >> taste[i].second; } for (int i = 0; i < n; i++) { vector<int> ch(n, 0); set<int> foods; DFS(i, ch, foods); } cout << answer << "\n"; return 0; }
정답코드
#include <iostream> #include <vector> using namespace std; int n; // 재료의 개수 long long answer = 987654321; // 최종 답, 충분히 큰 값으로 초기화 vector<pair<int, int>> taste; // 재료의 신맛과 쓴맛을 저장 int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; taste.resize(n); for (int i = 0; i < n; i++){ cin >> taste[i].first >> taste[i].second; } // 모든 경우의 수((1 << taste.size) -1). ex. n=3라면: 001, 010, 011, 100, 101, 111 // 비트마스크를 이용하여 모든 부분 집합을 탐색 for (int bitmask = 1; bitmask < (1 << taste.size()); bitmask++) { long long sour = 1, bitter = 0; // 각 부분 집합의 신맛과 쓴맛을 계산할 변수 초기화 // 비트마스크를 이용하여 현재 부분 집합에 포함된 재료를 탐색 for (int i = 0; i < taste.size(); i++) { if (bitmask & (1 << i)){ // 현재 i번째 재료가 부분 집합에 포함되어 있는지 확인 sour *= taste[i].first; bitter += taste[i].second; //cout << "-- " << taste[i].first << ", " << taste[i].second << "\n"; } } //cout << sour << ", " << bitter << "\n\n"; answer = min(answer, abs(sour - bitter)); } cout << answer << "\n"; return 0; }
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 1052번 C/C++] 물병 (0) | 2024.08.05 |
---|---|
[백준 16938번 C/C++] 캠프 준비 (0) | 2024.08.02 |
[백준 2800번 C/C++] 괄호 제거 (0) | 2024.07.31 |
[백준 15787번 C/C++] 기차가 어둠을 헤치고 은하수를 (0) | 2024.07.30 |
[백준 14569번 C/C++] 시간표 짜기 (0) | 2024.07.29 |
댓글
이 글 공유하기
다른 글
-
[백준 1052번 C/C++] 물병
[백준 1052번 C/C++] 물병
2024.08.05 -
[백준 16938번 C/C++] 캠프 준비
[백준 16938번 C/C++] 캠프 준비
2024.08.02 -
[백준 2800번 C/C++] 괄호 제거
[백준 2800번 C/C++] 괄호 제거
2024.07.31 -
[백준 15787번 C/C++] 기차가 어둠을 헤치고 은하수를
[백준 15787번 C/C++] 기차가 어둠을 헤치고 은하수를
2024.07.30
댓글을 사용할 수 없습니다.