Link
https://www.acmicpc.net/problem/17208
Detail
이문제는 매우 흔한 배낭문제의 포멧형태를 띄우고 있다. 그러나 요구하는 Weight의 종류가 치즈버거, 감자튀김 총 두가지인 형태를 갖추고 있어, 기본 구조를 조금 변형한 3차원 형태의 배낭문제로써 해석할 수 있다.
3차원 배낭구조 Table을 만들고, 그에 맞는 식을 세워서 해결 할 수 있다.
Code
// Code Here
#include<bits/stdc++.h>
using namespace std;
int main() {
// fast io
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int order_cnt;
int max_c;
int max_p;
vector<pair<int, int>> orders;
cin >> order_cnt >> max_c >> max_p;
for (int i = 0; i < order_cnt; i++) {
int c, p;
cin >> c >> p;
orders.emplace_back(c, p);
}
// 3차원 knapsack
// dp[i][c][p] = i번째 주문까지 고려했을 때, c원 이하로 구매하고 p원 이하로 지불할 수 있는 최대 주문 수
vector<vector<vector<int>>> dp
(order_cnt + 1, vector<vector<int>>(max_c + 1, vector<int>(max_p + 1, 0)));
for (int i = 1; i <= order_cnt; i++) {
for (int c = 0; c <= max_c; c++) {
for (int p = 0; p <= max_p; p++) {
dp[i][c][p] = dp[i - 1][c][p];
if (c >= orders[i - 1].first and p >= orders[i - 1].second) {
dp[i][c][p] = max(dp[i][c][p], dp[i - 1][c - orders[i - 1].first][p - orders[i - 1].second] + 1);
}
}
}
}
cout << dp[order_cnt][max_c][max_p] << '\n';
}