부분집합의 합
- 💾 알고리즘/알고리즘 기초
- 2020. 10. 6.
문제
https://www.acmicpc.net/problem/1182
1182번: 부분수열의 합
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
www.acmicpc.net
백준(BOJ) 1182 - 부분수열의 합 (부분집합 구하기) //[java]- 재귀
부분수열의 합문제N개의 정수로 이루어진 수열이 있을 때, 길이가 양수인 부분수열 중에서 그 수열의 원소...
blog.naver.com
참고로 모두 방문하지 않은 경우는 제외해 줘야 한다.(공집합의 경우)
코드
package org.kyhslam.CodeUp;
import java.util.Scanner;
public class p3009_11 {
static int[] array ; // {-7, -3, -2, 5, 8};
static int count = 0; //
static int N = 0;
static int S = 0;
static boolean[] visited;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
S = sc.nextInt();
array = new int[N];
visited = new boolean[N];
for(int i=0; i < N; i++){
array[i] = sc.nextInt();
}
for(int i=0; i < array.length; i++){
//System.out.println(array[i]);
}
func(array, 0,0, visited);
System.out.println(count);
}
//방문이 모두 false였을 경우, = 공집합의 경우는 제외하고 계산해야 한다.
public static void func(int[] arr, int level, int sum, boolean[] visit){
if(level == N){
//모두 방문하지 않은거는 제외
int falseCnt = 0;
for (int i=0; i < visited.length; i++){
if(visit[i] == false){
falseCnt++;
}
}
if(falseCnt != N){
if(sum == S){
count++;
}
}
}else{
visit[level] = true;
func(arr, level+1, sum + arr[level], visit);
visit[level] = false;
func(arr, level+1, sum , visit);
}
}
}
'💾 알고리즘 > 알고리즘 기초' 카테고리의 다른 글
이진트리 깊이우선탐색(DFS : Depth First Search) (0) | 2021.08.11 |
---|---|
다익스트라(Dijkstra Algorithm) (0) | 2020.10.16 |
우선순위 큐 : 객체의 특정값으로 정렬 (0) | 2020.09.25 |
유니온 파인드 (Union-Find) (0) | 2020.09.23 |
우선순위 큐 : priority_queue (최대힙, 최소힙) (0) | 2020.09.15 |