Junior-Developer
Home
  • Category (316)
    • 문제풀이 (270)
      • 백준oj (201)
      • 프로그래머스 (53)
      • 명품 자바 프로그래밍(개정4판) (11)
      • 구름 (5)
    • 알고리즘 (6)
    • Node.js (2)
    • 체크리스트 (37)
블로그 내 검색
Home

Junior-Developer

1일 1커밋! 1일 1 백준!

  • 문제풀이/백준oj

    [백준OJ] 19942번 다이어트

    2021. 9. 6.

    by. Hyeon-Uk

    반응형

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

     

    19942번: 다이어트

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

    www.acmicpc.net


     

    풀이

    음식들의 영양소를 모두 입력받은뒤에, 백트래킹을 이용하여 해당 음식을 선택했을때와 , 선택하지 않았을때의 경우를 모두 고려하여 매 함수 진입마다 최솟값을 갱신해주면된다.

     

    시간복잡도

    N개의 음식마다 선택의 길이 2가지 경우이므로, O(215)가 된다.

     

    코드

    #include<iostream>
    #include<algorithm>
    #include<vector>
    #define MAX 987654321
    using namespace std;
    
    //영양소
    typedef struct node{
    	int num, p, f, s, v, c;
    }node;
    
    int n, mp, mf, ms, mv,ret=MAX;
    vector<int> ret_v;//최솟값의 음식번호를 저장하는 벡터
    vector<int> temp_v;//임시벡터
    vector<node> foods;
    bool visited[15];
    
    int isOver() {
    	int sp, sf, ss, sv, sc;
    	sp = sf = ss = sv = sc = 0;
    	temp_v.clear();
    	for (int i = 0; i < n; i++) {
    		if (visited[i]) {
    			sp += foods[i].p;
    			sf += foods[i].f;
    			ss += foods[i].s;
    			sv += foods[i].v;
    			sc += foods[i].c;
    			temp_v.push_back(foods[i].num);
    		}
    	}
    	if (sp >= mp && sf >= mf && ss >= ms && sv >= mv) {
    		return sc;
    	}
    	else {
    		return -1;
    	}
    }
    
    void dfs(int ind) {
    	int sum=isOver();
    	if (sum!=-1&&ret>sum) {
    		ret = min(ret, sum);
    		ret_v = temp_v;
    	}
    
    	if (ind == n) {
    		return;
    	}
    	visited[ind] = true;
    	dfs(ind + 1);
    	visited[ind] = false;
    	dfs(ind + 1);
    }
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(0); cout.tie(0);
    	cin >> n;
    	cin >> mp >> mf >> ms >> mv;
    	for (int i = 0; i < n; i++) {
    		int p, f, s, v, c;
    		cin >> p >> f >> s >> v >> c;
    		foods.push_back({ i + 1,p,f,s,v,c });
    	}
    	dfs(0);
    	if (ret == MAX) {
    		cout << -1;
    	}
    	else {
    		cout << ret << "\n";
    		for (int i = 0; i < ret_v.size(); i++) {
    			cout << ret_v[i] << " ";
    		}
    	}
    	return 0;
    }
    반응형
    저작자표시 (새창열림)

    '문제풀이 > 백준oj' 카테고리의 다른 글

    [백준OJ] 4803번 트리  (0) 2021.09.09
    [백준OJ] 2015번 수들의 합 4  (0) 2021.09.07
    [백준OJ] 6209번 제자리 멀리뛰기  (0) 2021.09.03
    [백준OJ] 17298번 오큰수  (2) 2021.09.02
    [백준OJ] 22993번 서든어택 3  (0) 2021.09.01

    댓글

    관련글

    • [백준OJ] 4803번 트리 2021.09.09
    • [백준OJ] 2015번 수들의 합 4 2021.09.07
    • [백준OJ] 6209번 제자리 멀리뛰기 2021.09.03
    • [백준OJ] 17298번 오큰수 2021.09.02
    맨 위로
전체 글 보기
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Powered by ⓒ Kakao Corp.

Designed by Nana
블로그 이미지
Hyeon-Uk

티스토리툴바