https://www.acmicpc.net/problem/2798
2798번: 블랙잭
첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장
www.acmicpc.net
순열로 M보다 작은 합의 모든 경우의 수를 따졌다
어렵게 생각하지 않고 풀 수 있을 문제긴 하다.
순열에서 중복 제거를 하면 개선될 수 있을 거 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N,M,answer,sum=0,max = 0;
static int[] arr,output;
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());
M = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
arr = new int[N];
output = new int[N];
visited = new boolean[N];
int r = 3;
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
perm(N,0,r);
System.out.println(answer);
}
public static void perm(int n, int depth, int r) {
if(depth == r) {
for (int i = 0; i < r; i++) {
sum+= output[i];
}
if(sum<=M) {
if(max<=sum) {
max = sum;
}
}
answer =max;
sum = 0;
return;
}
for (int i = 0; i < arr.length; i++) {
if(!visited[i]) {
visited[i] = true;
output[depth] = arr[i];
perm(n,depth+1,r);
visited[i] = false;
}
}
}
}
'ALGORITHM' 카테고리의 다른 글
[백준] 14719번 빗물 (0) | 2020.10.24 |
---|