https://www.acmicpc.net/problem/4781
4781번: 사탕 가게
각 테스트 케이스의 첫째 줄에는 가게에 있는 사탕 종류의 수 n과 상근이가 가지고 있는 돈의 양 m이 주어진다. (1 ≤ n ≤ 5,000, 0.01 ≤ m ≤ 100.00) m은 항상 소수점 둘째자리까지 주어진다. 다음 n개
www.acmicpc.net
배낭문제로 해결할 수 있는 문제입니다.
가격 정보가 소수점 둘째자리까지 주어지므로 정수로 바꿔서 계산하였습니다.
다만 문제점은 반올림을 하기 위해 * 100 + 0.5를 해줘야한다는 점입니다.
| 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 | #include <iostream> #include <algorithm> #include <cstring> using namespace std; typedef long long ll; pair<int, int> list[5001]; ll dp[10001]; int N, M; void func() {     for (int i = 0; i < N; i++) {         for (int j = 1; j <= M; j++) {             if (list[i].second > j) continue;             dp[j] = max(dp[j], dp[j - list[i].second] + list[i].first);         }     }     cout << dp[M] << '\n'; } void input() {     double d;     for (int i = 0; i < N; i++) {         cin >> list[i].first >> d;         list[i].second = d * 100 + 0.5;     } } int main() {     cin.tie(NULL); cout.tie(NULL);     ios::sync_with_stdio(false);     double d;     while (1) {         cin >> N >> d;         M = d * 100 + 0.5;         if (!N) return 0;         input();         func();         memset(dp, 0, sizeof(dp));     } } | cs | 
'algorithm > dp' 카테고리의 다른 글
| boj 1311 할 일 정하기 1 (0) | 2021.06.21 | 
|---|---|
| boj 1577 도로의 개수 (0) | 2021.06.20 | 
| boj 2186 문자판 (0) | 2021.06.19 | 
| boj 13325 이진 트리 (0) | 2021.06.18 | 
| boj 1563 개근상 (0) | 2021.06.02 | 




