Algorithm/Acmicpc

1943 동전 분배 [JAVA]

시롱시롱 2024. 11. 29. 23:12

문제 풀이

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

 

처음엔 가능한 동전 집합에 다음 동전을 하나씩 더하며 새로운 경우를 추가해가며 전체 금액의 합/2를 만들어 보려 했으나... 메모리 + 시간이 말도안되기에 계속해서 터졌다.

 

갈피를 못잡다 결국 아래 블로그를 보고 이해를 했다

https://blog.naver.com/adamdoha/222086394461

 

1943번 : 동전 분배

문제 링크 : https://www.acmicpc.net/problem/1943 문제를 해결한 방법 웰논 DP 문제에서 아이디어를 떠...

blog.naver.com

설명이 너무 잘되어 있어 추가 설명은 하지 않겠다..

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        for(int t = 0 ; t<3; t++){
            int n = Integer.parseInt(br.readLine());
            int[][] coinInfo = new int[n][2];

            int total = 0;

            for (int i = 0; i < n; i++) {
                String[] s = br.readLine().split(" ");
                int value = Integer.parseInt(s[0]);
                int count = Integer.parseInt(s[1]);
                coinInfo[i][0] = value;
                coinInfo[i][1] = count;
                total += value*count;
            }

            if(total%2 == 1){
                System.out.println("0");
                continue;
            }

            int half = total/2;

            int[] dp = new int[half+1];
            Arrays.fill(dp, Integer.MAX_VALUE);
            dp[0] = 0;
            boolean isMade =false;

            for (int p = 0; p<n; p++) {
                int value = coinInfo[p][0];
                int count = coinInfo[p][1];

                for (int i = 0; i <= half; i++) {
                    if(dp[i] == Integer.MAX_VALUE)
                        continue;

                    if(dp[i] < count){
                        if(i + value == half){
                            isMade=true;
                            break;
                        }else if(i + value < half){
                            dp[i+value] = Math.min(dp[i+value], dp[i]+1);
                        }
                    }
                    dp[i] = 0;
                }
                if(isMade)
                    break;
            }

            if(isMade || dp[half] != Integer.MAX_VALUE){
                System.out.println(1);
            }else{
                System.out.println(0);
            }
        }
    }
}