문제
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 |