PS
백준 2961. 도영이가 만든 맛있는 음식
tose33
2021. 7. 21. 15:36
https://www.acmicpc.net/problem/2961
2961번: 도영이가 만든 맛있는 음식
첫째 줄에 재료의 개수 N(1 ≤ N ≤ 10)이 주어진다. 다음 N개 줄에는 그 재료의 신맛과 쓴맛이 공백으로 구분되어 주어진다. 모든 재료를 사용해서 요리를 만들었을 때, 그 요리의 신맛과 쓴맛은
www.acmicpc.net
1. 신맛,쓴맛의 정보를 vector<pair<int,int>> 형태로 저장한다
2. 재료를 1개부터 n개 까지 뽑는 조합을 만든다 (1,2번 재료, 1,3번 재료, 1,4,번재료 ... )
3. 만들어진 재료의 조합에 대하여 신맛과 쓴맛의 차이를 구한다
4. 가장 작은 차이를 계속 갱신한다
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n;
int res = 1000000001;
// 재료. {신맛, 쓴맛}
vector<pair<int,int>> v;
bool mark[11];
vector<pair<int,int>> ans;
// 만들어진 조합에 대하여 신맛과 쓴맛의 차이를 구해 리턴한다
int Calculate()
{
int s = 1; // 신맛은 곱하기므로 1로 초기화
int b = 0;
// 만들어진 조합에 대하여 총 신맛과 쓴맛을 구한다
for(auto x : ans)
{
s *= x.first;
b += x.second;
}
// 신맛과 쓴맛의 차이
return abs(s-b);
}
// 조합 k개를 뽑는다
void dfs(int idx, int depth, int k)
{
// k개를 뽑는 조합 만들어짐
if(depth == k)
{
res = min(res, Calculate());
return;
}
for(int i = idx; i < n; i++)
{
if(mark[i]) continue;
mark[i] = true;
ans.push_back(v[i]);
dfs(i, depth+1, k);
mark[i] = false;
ans.pop_back();
}
}
int main()
{
cin >> n;
for(int i = 0; i < n; i++)
{
int s,b;
cin >> s >> b;
v.push_back({s,b});
}
for(int i = 0; i < n; i++)
{
dfs(0, 0, i+1);
}
cout << res;
}