본문 바로가기
알고리즘/백준 문제

19942 - 다이어트

by HDobby 2023. 7. 13.

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

 

19942번: 다이어트

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

www.acmicpc.net

과정

  1. 단순 브루트 포스 문제이다.
  2. 1번 식재료 부터 시작해 기록해 나가며 영양소 기준을 만족하면 더 이상 진행할 필요가 없어 종료시킨다.
  3. 만족하는 것이 없다면 -1 을 출력하자.

코드

#include<iostream>
#include<string>

using namespace std;

int N;

int nut[16][5];
int minNut[4];
int ansCost = 987'654'321;
string ansStr;

void input(){
    cin>>N;
    cin>>minNut[0]>>minNut[1]>>minNut[2]>>minNut[3];
    for(int i=0;i<N;++i){
        cin>>nut[i][0]>>nut[i][1]>>nut[i][2]>>nut[i][3]>>nut[i][4];
    }
}

void dfs(int node, int cost, string chk, int mp, int mf, int ms, int mv){
    if(mp >= minNut[0] && mf >= minNut[1] && ms >= minNut[2] && mv >= minNut[3]){
        if(ansCost > cost){
            ansCost = cost;
            ansStr = chk;
        }
        return;
    }

    for(int i=node+1;i<N;++i){
        dfs(i,cost + nut[i][4], chk + to_string(i+1) + " ", mp+nut[i][0], mf+nut[i][1], ms+nut[i][2], mv+nut[i][3]);
    }
}

void solution(){
    for(int i=0;i<N;++i){
        dfs(i,nut[i][4],to_string(i+1) + " ", nut[i][0], nut[i][1], nut[i][2], nut[i][3]);
    }

    if(ansCost == 987'654'321){
        cout<<-1<<'\n';
    }
    else{
        cout<<ansCost<<'\n'<<ansStr<<'\n';
    }

    return ;
}

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

    input();
    solution();

    return 0;
}

728x90

'알고리즘 > 백준 문제' 카테고리의 다른 글

2179 - 비슷한 단어  (0) 2023.07.14
1446 - 지름길  (0) 2023.07.14
19949 - 영재의 시험  (0) 2023.07.13
19591 - 독특한 계산기  (0) 2023.07.13
20057 - 마법사 상어와 토네이도  (0) 2023.07.12

댓글