반응형
https://www.acmicpc.net/problem/19942
19942번: 다이어트
식재료 N개 중에서 몇 개를 선택해서 이들의 영양분(단백질, 탄수화물, 지방, 비타민)이 일정 이상이 되어야 한다. 아래 표에 제시된 6가지의 식재료 중에서 몇 개를 선택해서 이들의 영양분의 각
www.acmicpc.net
[ 문제풀이 ]
1. N을 입력받고, 백트래킹을 이용해 식재료를 선택하고 영양성분을 만족하고, 최소 비용이 든다면 ans에 식재료의 집합을 저장합니다.
2. 영양성분을 만족하지 못한다면 -1을 출력하고, 그렇지 않다면 비용과 ans 집합을 출력합니다.
[ 소스코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include<iostream> #include<vector> using namespace std; struct food { int p, f, s, v, c; }; int N; int mp, mf, ms, mv; food arr[15]; int cost = 987654321; int tmp[5]; vector<int> ans; vector<int> bucket; void dfs(int level, int n) { if (tmp[0] >= mp && tmp[1] >= mf && tmp[2] >= ms && tmp[3] >= mv) { if (cost > tmp[4]) { cost = tmp[4]; ans = bucket; } return; } if (level == N) { return; } for (int i = n; i < N; i++) { tmp[0] += arr[i].p; tmp[1] += arr[i].f; tmp[2] += arr[i].s; tmp[3] += arr[i].v; tmp[4] += arr[i].c; bucket.push_back(i); dfs(level + 1, i + 1); tmp[0] -= arr[i].p; tmp[1] -= arr[i].f; tmp[2] -= arr[i].s; tmp[3] -= arr[i].v; tmp[4] -= arr[i].c; bucket.erase(bucket.end() - 1); } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> N >> mp >> mf >> ms >> mv; for (int i = 0; i < N; i++) { cin >> arr[i].p >> arr[i].f >> arr[i].s >> arr[i].v >> arr[i].c; } dfs(0, 0); if (cost == 987654321) { cout << -1; return 0; } cout << cost << '\n'; for (auto& next : ans) { cout << next + 1 << ' '; } } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 1737번 - Pibonacci (C++) (0) | 2023.10.14 |
---|---|
[ 백준 ] 25498번 - 핸들 뭘로 하지 (C++) (0) | 2023.10.13 |
[ 백준 ] 21276번 - 계보 복원가 호석 (C++) (0) | 2023.10.11 |
[ 백준 ] 17085번 - 십자가 2개 놓기 (C++) (0) | 2023.10.10 |
[ 백준 ] 3780번 - 네트워크 연결 (C++) (0) | 2023.10.09 |