순간을 성실히, 화려함보단 꾸준함을

[ boj : 17208] 카우버거 알바생 본문

알고리즘,SQL/백준,BOJ

[ boj : 17208] 카우버거 알바생

폭발토끼 2021. 1. 25. 17:24

www.acmicpc.net/problem/17208

 

17208번: 카우버거 알바생

중간고사 종료를 기념해 계획 없이 돈을 쓰던 영석이는 안타깝게도 통장 잔고가 100원도 남지 않게 되었고, 결국 영석이는 카우버거 주방 알바를 하기로 했다. 카우버거는 치즈버거와 감자튀

www.acmicpc.net

문제 : 치즈버거와 감자튀김이 남았다. 이를 이용해서 최대로 많이 주문을 받을 수 있는 수를 구하자

 

해설 : dp는 언제나 어렵습니다....(저에게 ㅠ)

먼저 전 치즈버거와 감자튀김의 변수를 이용하여 2차원 dp테이블로 작성해보려 했습니다. 그러나 문제가 생기는데 바로 '동일한 치즈버거와 감자튀김이 남았을 경우 그 값이 최적의 값이 아니게 됩니다'

그 이유는 주문하는 순서를 고려하고 풀어나가야 되는데 그러지 못하기 때문이죠 ㅠㅠ

 

그래서 3차원 테이블을 사용했습니다.

dp[x][y][cnt] : x개의 치즈버거와 y개의 감자튀김이 남았고 현재 cnt 번호 까지 주문을 했을때 가질 수 있는 최대값

그럼 이제 현재 주문을 선택할 수 있으면 선택하고, 선택하지 않고 다음 주문번호로 넘어가게끔 구현을 해주면 되겠죠

 

#include<bits/stdc++.h>

using namespace std;

int n, m, k;
int dp[301][301][100],visit[100];
vector<pair<int, int>> v;

int solve(int x, int y,int cnt);

int main()
{
	cin >> n >> m >> k;
	v.resize(n);
	for (int i = 0; i < n; i++)
		cin >> v[i].first >> v[i].second;
	memset(dp, -1, sizeof(dp));
	cout<<solve(m, k,0);
	return 0;
}
int solve(int x,int y,int cnt)
{
	int& ret = dp[x][y][cnt];
	if (cnt >= n)return ret = 0;
	if (ret != -1)return ret;

	ret = 0;
	if (x - v[cnt].first >= 0 && y - v[cnt].second >= 0)
		ret = max(ret, solve(x - v[cnt].first, y - v[cnt].second, cnt + 1)+1);
	ret = max(ret, solve(x, y, cnt + 1));
	return ret;
}

'알고리즘,SQL > 백준,BOJ' 카테고리의 다른 글

[ boj : 2982 ]국왕의 방문  (0) 2021.01.27
[ boj : 1503 ] 세 수 고르기  (0) 2021.01.27
[ boj : 14225 ]부분수열의 합  (0) 2021.01.23
[ boj : 11578] 팀원 모집  (0) 2021.01.22
[ boj : 1821] 수들의 합  (0) 2021.01.20