관리 메뉴

Mini

백준 19942 c++ //비트마스킹, 벡터사전순 정렬방법 본문

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;
}