코드
import java.util.*;
class 수열추측하기{
static int[] b, p, ch;
static int n, f;
static boolean flag=false;
static int[][] dy=new int[35][35];
static int combi(int n, int r){
if(dy[n][r]>0) return dy[n][r];
if(n==r || r==0) return 1;
else return dy[n][r]=combi(n-1, r-1)+combi(n-1, r);
}
static void DFS(int L, int sum){
if(flag) return;
if(L==n){
if(sum==f){
for(int x : p) System.out.print(x+" ");
flag=true;
}
}else{
for(int i=1; i<=n; i++){
if(ch[i]==0){
ch[i]=1;
p[L]=i;
DFS(L+1, sum+(p[L]*b[L]));
ch[i]=0;
}
}
}
}
public static void main(String[] args){
n=4;
f=16;
b=new int[n];
p=new int[n];
ch=new int[n+1];
for(int i=0; i<n; i++){
b[i]=combi(n-1, i);
}
System.out.println(Arrays.toString(b));
DFS(0, 0);
}
}
결과
[1, 3, 3, 1]
3 1 2 4
미리 메모이제이션을 이용해서 경우의 수를 계산 후 이를 사용
'자료구조&알고리즘 > 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비' 카테고리의 다른 글
미로탐색DFS (0) | 2023.03.26 |
---|---|
조합구하기 (0) | 2023.03.24 |
조합의경우수 메모이제이션 (0) | 2023.03.20 |
동전개수 구하기 (0) | 2023.03.16 |
중복순열 구하기 (0) | 2023.03.14 |