본문 바로가기

개발/알고리즘

백준 4781번 사탕가게 C++

문제

www.acmicpc.net/problem/4781

 

4781번: 사탕 가게

각 테스트 케이스의 첫째 줄에는 가게에 있는 사탕 종류의 수 n과 상근이가 가지고 있는 돈의 양 m이 주어진다. (1 ≤ n ≤ 5,000, 0.01 ≤ m ≤ 100.00) m은 항상 소수점 둘째자리까지 주어진다. 다음 n개

www.acmicpc.net

코드1

#include<bits/stdc++.h>

using namespace std;

int n, c, dp[10001];
double m, p;
pair<int, int> candy[5001];

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

	while (true)
	{
		memset(dp, 0, sizeof(dp));
		cin >> n >> m;
		if (n == 0)
			break;

		for (int i = 0; i < n; i++)
		{
			cin >> c >> p;
			candy[i] = make_pair(c, (int)(p * 100 + 0.5));
		}

		int money = (int)(m * 100 + 0.5);
		for (int i = 0; i < n; i++)
		{
			for (int j = candy[i].second; j <= money; j++)
			{
				dp[j] = max(dp[j], dp[j - candy[i].second] + candy[i].first);
			}
		}
		cout << dp[money] << "\n";
	}

	return 0;
}

 

코드2

#include<bits/stdc++.h>

using namespace std;

int n, c, dp[10001];
double m, p;
pair<int, int> candy[5001];

int go(int cash)
{
	int& result = dp[cash];
	if (result != -1)
		return result;
    
    result = 0;
	for (int i = 0; i < n; i++)
	{
		if (cash - candy[i].second >= 0)
		{
			result = max(result, go(cash - candy[i].second) + candy[i].first);
		}	
	}
	return result;
}

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

	while (true)
	{
		memset(dp, -1, sizeof(dp));
		cin >> n >> m;
		if (n == 0)
			break;

		for (int i = 0; i < n; i++)
		{
			cin >> c >> p;
			candy[i] = make_pair(c, (int)(p * 100 + 0.5));
		}

		cout << go((int)(m * 100 + 0.5)) << "\n";
	}

	return 0;
}

'개발 > 알고리즘' 카테고리의 다른 글

백준 1647 도시 분할 계획 C++  (0) 2021.04.17
백준 1344 축구 C++  (0) 2021.04.16
백준 2470 두 용액 C++  (0) 2021.04.13
백준 4811번 알약 C++  (0) 2021.04.13
백준 15651 N과M(3) - 중복 순열 C++  (0) 2021.04.11