728x90
문제
: 멱집합 구하기
: 멱집합의 합이 N보다 작거나 같은 수 중, N에 가장 가까운 수를 출력하기
문제 링크 : https://www.acmicpc.net/submit/2798/53798850
원리
: M개의 수 중에 N보다 작거나 같은 수 중, 가장 N에 가까운 수를 구하기
풀이방법
: 멱집합을 구하는 재귀메서드의 베이스 코드에서, 세 숫자의 합이 지정숫자보다 작거나 같으면 result와 비교해 값 교체
나의 코드
: 멱집합 사용(재귀)
: 멱집합을 구하는 재귀메서드의 베이스 코드에서, 세 숫자의 합이 지정숫자보다 작거나 같으면 result와 비교해 값 교체
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int max_cnt = 3;
static int[] subset;
static int result;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] nums = new int[N];
StringTokenizer st2 = new StringTokenizer(br.readLine(), " ");
for(int i = 0 ; i < N ; i++) nums[i] = Integer.parseInt(st2.nextToken());
subset = new int[N];
Combination(nums,0, 0, M);
System.out.println(result);
}
private static void Combination(int[] nums, int cnt, int k, int M) {
if (cnt == max_cnt) {
int sum = 0;
for(int i = 0; i < 3 ; i++) sum += subset[i];
if(sum<=M && result<=sum) result = sum;
return;
}
for (int i = k; i < nums.length; i++) {
subset[cnt] = nums[i];
Combination(nums, cnt + 1, i + 1, M);
}
}
}
728x90
'알고리즘 저장소 (일반방식과 나만의 풀이) > JAVA' 카테고리의 다른 글
[백준] no.1654: 랜선 자르기 (0) | 2023.01.12 |
---|---|
[백준] no10816: 숫자 카드 2 (0) | 2023.01.10 |
[백준] no1929: 소수 구하기 (0) | 2023.01.09 |
[백준] no2231: 분해합 (2) | 2023.01.08 |
[백준] no1181: 단어정렬 (0) | 2023.01.07 |