Algorithm/백준 알고리즘

백준_18429 근손실(자바)/ 백트래킹

미스터로즈 2021. 7. 21. 20:47

시간&메모리 제한

 

문제

 

입력&출력

 

문제 풀이

package com.Back;

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

public class Back_18429 {
	static int N,K,ans;
	static int weight[];
	static boolean visited[];
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());
		weight = new int[N];
		visited= new boolean[N];
		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < N; i++) {
			weight[i]=Integer.parseInt(st.nextToken());
		}
		perm(0,0);
		System.out.println(ans);
	}

	private static void perm(int cnt,int totalweight) {
		if(totalweight<0)return;
		if(cnt==N) {
			ans++;
			return;
		}
		for (int i = 0; i < N; i++) {
			if(visited[i])continue;
			visited[i]=true;
			perm(cnt+1, totalweight+weight[i]-K);
			visited[i]=false;
		}
	}
}

- 이 문제는 브루드 포스랑 백트래킹을 이용하는 문제입니다.

- 순열을 이용해서 N개 중에 N개를 나열 하는데 순서가 존재합니다.

- 각 단계에서 500이하로 내려가면 안되기 때문에 메소드 시작하는 부분에서 예외처리를 해줍니다.

- 현재 cnt 및 전체 무게를 계속 카운팅 해주면서 진행하면 됩니다.