본문 바로가기

삼성전자 알고리즘/백준온라인

2. 2961 도영이가 만든 맛있는 음식

문제 출처 : https://www.acmicpc.net/problem/2961

 

2961번: 도영이가 만든 맛있는 음식

문제 도영이는 짜파구리 요리사로 명성을 날렸었다. 이번에는 이전에 없었던 새로운 요리에 도전을 해보려고 한다. 지금 도영이의 앞에는 재료가 N개 있다. 도영이는 각 재료의 신맛 S와 쓴맛 B를 알고 있다. 여러 재료를 이용해서 요리할 때, 그 음식의 신맛은 사용한 재료의 신맛의 곱이고, 쓴맛은 합이다. 시거나 쓴 음식을 좋아하는 사람은 많지 않다. 도영이는 재료를 적절히 섞어서 요리의 신맛과 쓴맛의 차이를 작게 만들려고 한다. 또, 물을 요리라고 할 수는

www.acmicpc.net

#include <iostream>
using namespace std;
typedef struct ingredient {
	int sourness;	// 신맛
	int bitter;		// 쓴맛
}Ingredient;

int tmpArr[100];
int sournessArr[100];
int bitterArr[100];
long long int min_num = 999999999999999;

void printCombination(Ingredient arr[], int index){
	int tmp = 0, sourness = 1, sweetness = 0;
	for (int i = 0; i < index; ++i){
		sourness *= sournessArr[i];
		sweetness += bitterArr[i];
	}
	tmp = sourness - sweetness;
	if (tmp<0){
		tmp *= -1;
	}
	if (min_num>tmp){
		min_num = tmp;	//가장 작은 값만 대입
	}
//	printf("%d\n", tmp);
}
void Comb(Ingredient arr[], int index, int n, int r, int target){	//target은 출력할 횟수
	if (r == 0){	//다 뽑은 경우
		printCombination(arr, index);
	}
	else if (target == n) return;	// r개를 다 뽑았는데 arr의 모든 원소를 다 검사할 때. 실패 : 아무것도 안함
	else{
		sournessArr[index] = arr[target].sourness;
		bitterArr[index] = arr[target].bitter;
		Comb(arr, index + 1, n, r - 1, target + 1);
		Comb(arr, index, n, r, target + 1);
	}
}//end combination()

int main(){
	//조합을 이용해서 경우의 수 다 뽑아 낸 후
	//최소값일 때 마다 넣어주기
	//nC1 nC2 nC3 nC4.. nCn-1 는 for문으로 구현해야 함.
	//조합 https://gorakgarak.tistory.com/523?category=265216
	//http://bitly.kr/kT2z3Y

	int num;
	scanf("%d", &num);
	Ingredient *ing = new Ingredient[num];
    //입력을 받은 뒤 조합으로 경우의 수 모두 출력 ... 모든 경우의 수 중 최소값만 저장
	for (int i = 0; i < num; i++){
		scanf("%d %d", &ing[i].sourness, &ing[i].bitter);
	}
	for (int i = 1; i <= num; i++){
		Comb(ing, 0, num, i, 0);
	}
	cout << min_num << endl;
	return 0;
}

1. 조합으로 모든 경우의 수를 계산

2. 모든 경우의 수 중 최소값만 저장

'삼성전자 알고리즘 > 백준온라인' 카테고리의 다른 글

6. 3653 영화 수집  (0) 2019.06.28
5. 10755 컴퓨터실  (0) 2019.06.28
4. 11066 파일 합치기 [힙]  (0) 2019.06.16
3. 2805 나무 자르기  (0) 2019.06.16
1. 1920 수 찾기  (0) 2019.05.07