PS/inflearn java coding

동전교환 (DFS)

easy16 2022. 4. 12. 23:46

1. DFS(Level, sum) 형태로 해결

- 동전 종류만큼 N개 노드 생성

- level은 동전의 갯수, sum은 총액이 된다.

2. 최적화를 위해 단위가 큰 동전부터 탐색(노드를 생성)한다.

//아래 조건의 하위노드 생성하지 않음.
if ( sum > m || level >= min) return;

//만족하는 level 중 최소 값을 찾는다.
if ( sum == m) {
min = Math.min(min, level);
}

 

class Main {

	static int m, n;				
    //level의 최소값 찾기
	static int answer;
	static int min=Integer.MAX_VALUE;
	public void DFS( int level, int sum, int [] coin) {
		
		//아래 조건의 하위노드 생성하지 않음.
		if ( sum > m || level >= min) return;
		
		//만족하는 level 중 최소 값을 찾는다.
		if ( sum == m) {				
			min = Math.min(min, level);			
		} else {
			//코인의 갯수만큼 노드 생성, 큰 동전부터 탐색한다.
			for ( int i = n-1 ; i >=0 ; --i) {
				DFS(level + 1 , sum + coin[i],  coin);
			}
			
		}
		
	}
	public static void main(String args[]) throws Exception {
		Main M = new Main();
		Scanner in = new Scanner(System.in);
		n = in.nextInt();
		int coin[] = new int[n];
		for ( int i = 0 ; i < n ; i++)
			coin[i] = in.nextInt();
		
		m = in.nextInt();
		
		M.DFS(0, 0, coin);
		System.out.println(min);
	}

}

ex)
input
3
1 2 5
15
output
3