1일1알

백준 19942번 다이어트 C++ 본문

알고리즘

백준 19942번 다이어트 C++

영춘권의달인 2023. 5. 27. 12:30

https://www.acmicpc.net/problem/19942

 

19942번: 다이어트

식재료 N개 중에서 몇 개를 선택해서 이들의 영양분(단백질, 탄수화물, 지방, 비타민)이 일정 이상이 되어야 한다. 아래 표에 제시된 6가지의 식재료 중에서 몇 개를 선택해서 이들의 영양분의 각

www.acmicpc.net

 

백트래킹으로 모든 조합을 검사하며 조건을 만족하면서 가격이 최소인 조합을 찾았다.

 

#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <list>
#include <unordered_map>
#include <unordered_set>
#include <iomanip>
#include <limits.h>

using namespace std;
using int64 = long long;

struct Info {
    int p;
    int f;
    int s;
    int v;
    int price;
};

int n;
int mp, mf, ms, mv;

int minPrice = 0x7fffffff;
vector<int> ansIdxes;

vector<Info> v;
vector<bool> visited;
vector<int> idxes;

void BT(int idx) {
    int currP = 0;
    int currF = 0;
    int currS = 0;
    int currV = 0;
    int currPrice = 0;
    for (auto a : idxes) {
        currP += v[a].p;
        currF += v[a].f;
        currS += v[a].s;
        currV += v[a].v;
        currPrice += v[a].price;
    }
    if (currP >= mp && currF >= mf && currS >= ms && currV >= mv) {
        if (currPrice < minPrice) {
            minPrice = currPrice;
            ansIdxes.clear();
            for (auto a : idxes) {
                ansIdxes.push_back(a);
            }
        }
    }
    for (int i = idx; i < n; i++) {
        if (visited[i]) continue;
        visited[i] = true;
        idxes.push_back(i);
        BT(i + 1);
        visited[i] = false;
        idxes.pop_back();
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> n;
    cin >> mp >> mf >> ms >> mv;
    v = vector<Info>(n);
    visited = vector<bool>(n, false);
    for (int i = 0; i < n; i++) {
        cin >> v[i].p;
        cin >> v[i].f;
        cin >> v[i].s;
        cin >> v[i].v;
        cin >> v[i].price;
    }
    BT(0);
    if (minPrice == 0x7fffffff) cout << -1;
    else {
        cout << minPrice << "\n";
        for (auto a : ansIdxes) {
            cout << a + 1 << " ";
        }
        cout << "\n";
    }
}