[백준 4781][C++] 사탕 가게

2023. 10. 26. 12:44·코딩 공부/백준(C++)

문제 링크

https://www.acmicpc.net/problem/4781

 

4781번: 사탕 가게

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

www.acmicpc.net

 


◆문제 해결 및 설명◆

문제 해설 : 사탕 가게에 있는 모든 사탕의 가격과 칼로리가 주어졌을 때, 어떻게 하면 칼로리의 합이 가장 크게 되는지를 구하는 프로그램을 작성하시오.

 

보자마자 DP를 사용한 배낭문제를 떠올렸고, 이와 다른점은 중복된 캔디를 넣을 수 있음을 파악하고 코드를 작성하였다.

가격이 소수형이라서 이를 정수로 처리하기 위해 100을 곱해주었다.

부동소수점 방식의 문제로 소수의 오차가 발생하는 것은 0.005를 더해주어 방지하였다.(제공되는 가격은 소수 둘째자리까지여서 3자릿수를 더해주었다.)

(오차의 예는 10.03을 저장하고 출력하면 10.02가 되는 것을 볼 수 있다.)

        cin >> Case >> Money;
        if (Case == 0 && Money == 0)
        {
            break;
        }
        Money += 0.005;
        int money = Money * 100;

 

하나의 열(vec)을 만들고 vec[i] = max(kcal + vec[i - price], vec[i]); 계산식을 통해 가장 최고의 칼로리가 되는 값을 DP로 구현하였다.

 

처음에는 max_element를 사용해서 최적을 찾았는데, DP를 사용했기 때문에 vec[money]에 최적의 값을 가지고 있음을 뒤늦게 알게되어 속도 향상을 위해 수정하였다.

        // cout << *max_element(vec.begin(), vec.end()) << endl;
        cout << vec[money] << endl;

 

◆코드 전문◆

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int Case;
    double Money;

    while (1)
    {
        cin >> Case >> Money;
        if (Case == 0 && Money == 0)
        {
            break;
        }
        Money += 0.005;
        int money = Money * 100;

        vector<pair<int, int>> items;
        for (int i = 0; i < Case; i++)
        {
            int kcal;
            double price;
            cin >> kcal >> price;
            price += 0.005;
            price *= 100;
            items.push_back({kcal, price});
        }

        vector<int> vec(money + 100, 0);
        for (int k = 0; k < items.size(); k++)
        {
            int kcal, price;
            tie(kcal, price) = items[k];

            for (int i = price; i <= money; i++)
            {
                vec[i] = max(kcal + vec[i - price], vec[i]);
            }
        }
        
        // cout << *max_element(vec.begin(), vec.end()) << endl;
        cout << vec[money] << endl;
    }
}

'코딩 공부 > 백준(C++)' 카테고리의 다른 글

[백준 2563][C++] 색종이  (0) 2023.10.29
[백준 10798][C++] 세로읽기  (0) 2023.10.28
[백준 14497][C++] 주난이의 난(難)  (1) 2023.10.21
[백준 13549][C++] 알파벳  (1) 2023.10.21
[백준 1245][C++] 농장 관리  (0) 2023.10.21
'코딩 공부/백준(C++)' 카테고리의 다른 글
  • [백준 2563][C++] 색종이
  • [백준 10798][C++] 세로읽기
  • [백준 14497][C++] 주난이의 난(難)
  • [백준 13549][C++] 알파벳
메카인
메카인
  • 메카인
    메카인의 지식창고
    메카인
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 코딩 공부
        • TIL(Today I Learn)
        • TIL
        • 백준(C++)
        • Python
        • 알고리즘
        • 프로젝트 회고
      • C++
        • C++
        • C++ STL
        • C,C++ mCoding yotube
      • 게임개발
        • 언데드서바이벌_골드메탈_클론코딩
        • 3D_골드메탈_클론코딩
        • 유니티_문제해결
        • 게임 수학
      • Unreal 공부
        • UE5 GameDev
        • Unreal Engine 4 C++ The Ult..
      • 교재 문제 풀이
        • 운영체제
      • 정보처리기사
        • 정처기 요약
        • 정처기 오답노트
      • 학교수업
        • 데이터베이스
        • 프로그래밍 언어론
        • 리눅스 시스템
        • 네트워크
      • 일상
        • 주식
        • 독서
      • (비공개 전용)
        • memory
        • Build
        • OOP
        • Smart Pointer
        • lamda
        • 게임 수학
        • 모던 C++
        • 모던 C++ STL
        • 모던 C++ Concurrency, Paralle..
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 블로그 관리
  • 링크

  • 공지사항

    • 공지사항 - 인생과 블로그의 목표
  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
메카인
[백준 4781][C++] 사탕 가게
상단으로

티스토리툴바