본문 바로가기
알고리즘/백준 문제

1943 - 동전 분배

by HDobby 2023. 7. 25.

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

 

1943번: 동전 분배

세 개의 입력이 주어진다. 각 입력의 첫째 줄에 동전의 종류 N(1 ≤ N ≤ 100)이 주어진다. 각 입력의 둘째 줄부터 N+1째 줄까지 각각의 동전의 금액과 개수가 빈 칸을 사이에 두고 주어진다. 단, 원

www.acmicpc.net

과정

  1. 입력을 받으면서 가능한 코인의 경우를 true로 바꿔줍니다.
  2. coins를 모두 돌며 sum/2부터 역순으로 진행합니다.
  3. 이전 idx를 기준으로 탐색을 진행하기 때문에 탑다운 방식으로 진행합니다.
  4. 정답 이하인 경우만 진행하면 됩니다.

코드

#include<iostream>
#include<vector>

using namespace std;

vector<pair<int, int> > coins;
bool dp[100001];
int N;
int sum;

void input(){
    cin>>N;

    coins.resize(N);
    for(int i=0;i<N;++i){
        cin>>coins[i].first>>coins[i].second;
        sum += coins[i].first * coins[i].second;

        for(int i=1;i<=coins[i].second;++i)
            dp[i*coins[i].first] = true;
    }
}

void solution(){
    dp[0] = true;

    if(sum % 2 == 1){
        cout<<0<<'\n';
        return ;
    }

    for(int i=0;i<coins.size();++i){
        int value = coins[i].first;
        int nums = coins[i].second;

        for(int j=sum/2;j>=value;--j){
            if(dp[j-value]){
                for(int k=0;k<nums;++k){
                    if(j + value * k <= sum/2)
                        dp[j + value * k ] = true;
                    else 
                        break;
                }
            }
        }
    }

    cout<<dp[sum/2]<<'\n';
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    int T = 3;
    while(T--){
        sum = 0;
        coins.clear();
        fill(&dp[0], &dp[100001], false);
        input();
        solution();
    }

    return 0;
}

728x90

'알고리즘 > 백준 문제' 카테고리의 다른 글

2467 - 용액  (0) 2023.08.02
5972 - 택배 배송  (0) 2023.07.26
14719 - 빗물  (0) 2023.07.25
20437 - 문자열 게임 2  (0) 2023.07.24
17615 - 볼 모으기  (0) 2023.07.23

댓글