문제 출처: https://www.acmicpc.net/problem/3980
3980번: 선발 명단
문제 챔피언스 리그 결승전을 앞두고 있는 맨체스터 유나이티드의 명장 퍼거슨 감독은 이번 경기에 4-4-2 다이아몬드 전술을 사용하려고 한다. 오늘 결승전에 뛸 선발 선수 11명은 미리 골라두었지만, 어떤 선수를 어느 포지션에 배치해야 할지 아직 결정하지 못했다. 수석코치 마이크 펠란은 11명의 선수가 각각의 포지션에서의 능력을 0부터 100가지의 정수로 수치화 했다. 0은 그 선수가 그 포지션에 적합하지 않다는 뜻이다. 이때, 모든 선수의 포지션을 정하는
www.acmicpc.net
11명의 선수들이 각 포지션별로 능력치가 매겨져 있습니다. 11명의 선수들을 포지션을 잘 정해줘서 능력치의 합이 최대가 되도록 하는게 목표입니다. 11명의 포지션을 재귀를 통해서 정해줍니다. 첫 선수부터 차례대로 해당 포지션의 능력치가 0이 아니고 포지션이 배정이 되어있지 않다면 현재 포지션을 배정해 줍니다. 이런식으로 모든 경우를 계산해서 가장 큰 값을 구해주면 됩니다. 재귀 호출하는 부분에서 방문여부에다가 포지션의 능력치가 0인지를 확인하는 것만 추가해주면 되는 문제였습니다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include<iostream> | |
#include<vector> | |
using namespace std; | |
int member[11][11]; | |
bool visited[11]; | |
vector<int> vt; | |
int ans = 0; | |
int T; | |
void back(int k) | |
{ | |
if (vt.size() >= 11) | |
{ | |
int temp = 0; | |
for (int i = 0; i < 11; i++) | |
{ | |
temp += member[i][vt[i]]; | |
} | |
ans = (ans > temp) ? ans : temp; | |
return; | |
} | |
for (int i = 0; i < 11; i++) | |
{ | |
if (!visited[i] && member[k][i]) | |
{ | |
visited[i] = true; | |
vt.push_back(i); | |
back(k + 1); | |
vt.pop_back(); | |
visited[i] = false; | |
} | |
} | |
} | |
int main(void) | |
{ | |
ios_base::sync_with_stdio(false); cin.tie(NULL); | |
cin >> T; | |
for (int t = 1; t <= T; t++) | |
{ | |
ans = 0; | |
for (int i = 0; i < 11; i++) | |
{ | |
for (int j = 0; j < 11; j++) | |
{ | |
cin >> member[i][j]; | |
} | |
} | |
back(0); | |
cout << ans<<'\n'; | |
} | |
} |
'문제 해결 > BOJ' 카테고리의 다른 글
[BOJ] 일요일 아침의 데이트 (0) | 2023.02.02 |
---|---|
[백준] 10986번 나머지 합 - python (1) | 2022.09.29 |
[BOJ] 1436번 영화감독 숌 (0) | 2019.08.18 |
[BOJ] 15683 감시 (0) | 2019.08.17 |
[BOJ] 14500 테트르미노 (0) | 2019.08.17 |