28447번 : 마라탕 재료 고르기
문제)
하얔이는 마라탕에 여러 재료를 넣어 먹는 것을 좋아한다. 하지만 마라탕에 항상 많은 재료를 넣는다고 맛있는 것은 아니다. 마라탕은 각 재료마다 궁합이 존재해서 같이 넣으면 맛있는 재료도 있고 그렇지 않은 경우도 있다. 여기서 하얔이는 고민에 빠졌다.
대체 어떻게 해야 개의 재료를 넣었을 때 마라탕의 맛을 최대로 할 수 있는거지?
와 재료 를 같이 넣었을 때의 궁합이라 하자. 마라탕의 맛은 마라탕에 들어간 모든 재료 쌍의 궁합의 합이다.
를 재료고른 재료의 그룹을 라고 했을 때 마라탕의 맛을 수식으로 표현하면 다음과 같다.
![](https://blog.kakaocdn.net/dn/btSTKP/btsFf2qM5nd/K6lzc0PkZcCWxjWUQ4EBj1/img.png)
가여운 하얔이를 위해 재료를 개만 사용했을 때의 최대의 마라탕의 맛을 구해보자.
입력 :
![](https://blog.kakaocdn.net/dn/b8DGLo/btsFerY55Jj/HNkKhRki11V8yitHNEyt60/img.png)
출력 :
첫째 줄에 개의 재료만 사용한 마라탕의 맛의 최댓값을 출력한다.
풀이)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
// 28447. 마라탕 재료 고르기
#include <iostream>
#include <vector>
#include <limits.h>
using namespace std;
int n, k;
vector<vector<int>> vec;
vector<int> choice;
int ans = INT_MIN;
void recur(int cur, int cnt)
{
if (cnt > k) return;
// 모든 조건을 살펴보았을 때.
if (cur == n)
{
// 마라탕 재료는 무조건 k를 골라야 한다.
if (cnt == k)
{
int res = 0;
for (int i = 0; i < cnt; i++)
{
int x = choice[i];
for (int j = i + 1; j < cnt; j++)
{
int y = choice[j];
res += vec[x][y];
}
}
// 정답 갱신
ans = max(ans, res);
}
return;
}
choice[cnt] = cur;
recur(cur + 1, cnt + 1);
recur(cur + 1, cnt);
}
int main()
{
cin >> n >> k;
vec.resize(n, vector<int>(n));
choice.resize(k + 1);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> vec[i][j];
}
}
recur(0, 0);
cout << ans;
return 0;
}
|
cs |
출처 : https://www.acmicpc.net/problem/28447
28447번: 마라탕 재료 고르기
재료 $1, 2, 4$를 고르면 $C_{1, 2} = 1, C_{1, 4} = 3, C_{2, 4} = 6$으로 최대인 $10$이 된다.
www.acmicpc.net
'Develop > 백준 (Cpp)' 카테고리의 다른 글
[백준] 1107번 : 리모컨 (C++) (0) | 2024.02.24 |
---|---|
[백준] 24954번 : 물약 구매 (C++) (0) | 2024.02.24 |
[백준] 1497번 : 기타콘서트 (C++) (0) | 2024.02.24 |
[백준] 16945번 : 매직 스퀘어로 변경하기 (C++) (0) | 2024.02.24 |
[백준] 2961번 : 도영이가 만든 맛있는 음식 (C++) (0) | 2024.02.24 |