1 << 15
를 이용할 수 있습니다.#include <iostream>
using namespace std;
struct ingredients { int p, f, s, v, c; };
int N, mp, mf, ms, mv;
ingredients foods[15];
int main()
{
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
cin >> N >> mp >> mf >> ms >> mv;
for (int i = 0; i < N; i++)
cin >> foods[i].p >> foods[i].f >> foods[i].s >> foods[i].v >> foods[i].c;
int answer = 1e9, answer_bit = 0;
// N개의 음식에 대한 모든 경우의 수 = 2^N
for (int i = 0; i < (1 << N); i++) {
int p = 0, f = 0, s = 0, v = 0, c = 0;
// set된 bit번째 재료가 선택됐다고 가정
for (int j = 0; j < 15; j++) {
if (i & (1 << j)) {
p += foods[j].p;
f += foods[j].f;
s += foods[j].s;
v += foods[j].v;
c += foods[j].c;
}
}
if (p >= mp && f >= mf && s >= ms && v >= mv) {
if (c < answer) {
answer = c;
answer_bit = i;
}
// 같은 경우 사전순으로 출력해야하기 때문에 문자열로 변경 후 비교
else if (c == answer) {
answer = c;
string lhs = "", rhs = "";
for (int j = 0; j < 16; j++) {
if (i & (1 << j)) lhs.push_back((char)(j + 1));
if (answer_bit & (1 << j)) rhs.push_back(char(j + 1));
}
if (lhs < rhs) answer_bit = i;
}
}
}
if (answer == 1e9) {
cout << -1 << '\n';
}
else {
cout << answer << '\n';
for (int i = 0; i < 16; i++)
if (answer_bit & (1 << i)) cout << (i + 1) << ' ';
cout << '\n';
}
return 0;
}
이렇게 유용한 정보를 공유해주셔서 감사합니다.