2961번: 도영이가 만든 맛있는 음식
문제 도영이는 짜파구리 요리사로 명성을 날렸었다. 이번에는 이전에 없었던 새로운 요리에 도전을 해보려고 한다. 지금 도영이의 앞에는 재료가 N개 있다. 도영이는 각 재료의 신맛 S와 쓴맛 B��
www.acmicpc.net
문제
도영이는 짜파구리 요리사로 명성을 날렸었다. 이번에는 이전에 없었던 새로운 요리에 도전을 해보려고 한다.
지금 도영이의 앞에는 재료가 N개 있다. 도영이는 각 재료의 신맛 S와 쓴맛 B를 알고 있다. 여러 재료를 이용해서 요리할 때, 그 음식의 신맛은 사용한 재료의 신맛의 곱이고, 쓴맛은 합이다.
시거나 쓴 음식을 좋아하는 사람은 많지 않다. 도영이는 재료를 적절히 섞어서 요리의 신맛과 쓴맛의 차이를 작게 만들려고 한다. 또, 물을 요리라고 할 수는 없기 때문에, 재료는 적어도 하나 사용해야 한다.
재료의 신맛과 쓴맛이 주어졌을 때, 신맛과 쓴맛의 차이가 가장 작은 요리를 만드는 프로그램을 작성하시오.
풀이
재료를 선택할 수도, 선택하지 않을 수도 있다. 재료를 적어도 하나 이상 사용해서 신맛과 쓴맛의 차이가 가장 작을때의 차이를 리턴하면된다.
재료의 개수는 10이므로 그냥 재귀로 다 찾아주면 된다. 신맛과 쓴맛의 크기는 최대 1,000,000,000이고, 신맛은 곱하고 쓴맛은 더하기 때문에 오버플로우가 생기지 않게 long long 으로 선언해주었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#include <iostream>
#include <algorithm>
#include <cmath>
#define MAX 11
using namespace std;
int N;
int a[MAX];
int b[MAX];
long long getFlavor(int pos, long long sour, long long bit,int cnt)
{
if (pos == N) {
if (cnt == 0) return 9999999999; // 적어도 하나의 재료는 사용해야한다.
return abs(sour - bit);
}
else return min(getFlavor(pos + 1, sour * a[pos + 1], bit + b[pos + 1],cnt+1), getFlavor(pos + 1, sour, bit,cnt));
}
int main(void)
{
cin >> N;
for (int i = 1; i <= N; ++i) {
cin >> a[i] >> b[i];
}
cout << getFlavor(0, 1, 0, 0) << "\n";
return 0;
}
|
//.////cs |
'알고리즘 > BOJ' 카테고리의 다른 글
백준 10757 큰 수 A + B (0) | 2020.08.17 |
---|---|
백준 5021 왕위계승 (1) | 2020.08.06 |
백준 1757 달려달려 (2) | 2020.07.12 |
백준 17208 카우버거 알바생 (0) | 2020.06.11 |
백준 10775 공항 (1) | 2020.06.08 |