Algorithm/비트마스킹
백준 19942 c++ //비트마스킹, 벡터사전순 정렬방법
Mini_96
2023. 12. 15. 04:24
https://www.acmicpc.net/problem/19942
19942번: 다이어트
식재료 N개 중에서 몇 개를 선택해서 이들의 영양분(단백질, 탄수화물, 지방, 비타민)이 일정 이상이 되어야 한다. 아래 표에 제시된 6가지의 식재료 중에서 몇 개를 선택해서 이들의 영양분의 각
www.acmicpc.net
1. 벡터사전순 정렬방법
vector<vector<int>> 에 넣고 sort 돌리고 vv[0]을 취하면 된다.
if (ret == w) {
vector<vector<int>> vv;
vv.push_back(tmp);
vv.push_back(arr);
sort(vv.begin(), vv.end());
arr = vv[0];
}
2. 전체코드
#include <bits/stdc++.h>
using namespace std;
int n, m, mp, mf, ms, mv;
int a[15][5];
int ret = 987654321;
vector<int> arr;
int main() {
cin.tie(0);
cin >> n >> mp >> mf >> ms >> mv;
for (int i = 0; i < n; ++i) {
cin >> a[i][0] >> a[i][1] >> a[i][2] >> a[i][3]>>a[i][4];
}
for (int subset = 1; subset < (1 << n); ++subset) {
int p = 0, f = 0, s = 0, v = 0, w=0;
vector<int> tmp;
for (int i = 0; i < n; ++i) {
if (subset & (1 << i)) { //subset돌면서 1이 켜졌는지 검사
p += a[i][0];
f += a[i][1];
s += a[i][2];
v += a[i][3];
w += a[i][4];
tmp.push_back(i+1);
}
}
//cout << p << " " << f << " " << s << " " << v << " \n";
if (p >= mp && f >= mf && s >= ms&& v>=mv) {
if (ret > w) {
ret = w;
arr = tmp;
}
if (ret == w) {
vector<vector<int>> vv;
vv.push_back(tmp);
vv.push_back(arr);
sort(vv.begin(), vv.end());
arr = vv[0];
}
}
}
if (ret == 987654321) {
cout << -1;
return 0;
}
cout << ret << "\n";
for (auto i : arr) cout << i << " ";
return 0;
}