# 문제
- 조합을 통해 완전탐색하는 문제
- 사전 순이라는 정의에 따라 원소 갯수와 상관없이
[3]
보다[1,2,3]
이 앞선다는 것을 명심해야됨 - for문의 i 변수는 N개 중 선택된 i개를 의미한다.
- for문의 j 변수를 통해 선택된 i의 이진데이터 1비트값을 기준으로 input을 인덱싱한다.
import Foundation
let N = Int(readLine()!)!
var input: [[Int]] = .init(repeating: .init(repeating: 0, count: 5), count: N)
var minimum: [Int] = readLine()!.split(separator: " ").map { Int($0)! }
var value = Int.max
var retValue: [Int:[[Int]]] = [:]
for i in 0..<N {
input[i] = readLine()!.split(separator: " ").map { Int($0)! }
}
for i in 1..<1<<N {
var nutrientSum = [0, 0, 0, 0]
var money = 0
var indicies: [Int] = []
// 고르기
for j in 0..<N {
if i & (1 << j) != 0 {
nutrientSum[0] += input[j][0]
nutrientSum[1] += input[j][1]
nutrientSum[2] += input[j][2]
nutrientSum [3] += input[j][3]
money += input[j][4]
indicies.append(j)
}
}
if nutrientSum[0] >= minimum[0]
&& nutrientSum[1] >= minimum[1]
&& nutrientSum[2] >= minimum[2]
&& nutrientSum[3] >= minimum[3] {
if value >= money {
value = money
if let _ = retValue[value] {
retValue[value]!.append(indicies)
} else {
retValue[value] = [indicies]
}
}
}
}
if value == Int.max {
print(-1)
exit(0)
}
print(value)
retValue[value]!.sorted(by: { prev, next in
return prev.map { String($0) }.joined() < next.map { String($0) }.joined()
})[0]
.forEach({
print($0 + 1, terminator: " ")
})