일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 데브옵스
- dbms
- 쿼리최적화
- 개발자
- 클라우드
- 트랜잭션
- 데이터베이스
- CS
- EC2
- 컴퓨터
- 개발공부
- 리눅스
- 서버
- 명령어
- TDD
- AWS
- 오라클
- 데이터베이스프로그래밍
- 리눅스공부
- 시스템프로그래밍
- 쿼리
- DB
- 공부
- jdbc programming
- 개발방법론
- JDBC
- 자바
- Database
- sql
- 클라우드네이티브
Archives
- Today
- Total
개발 블로그
백준 1182: 부분수열의 합 본문
https://www.acmicpc.net/problem/1182
이 문제는 멱집합을 구하는 알고리즘을 조금 변형하면 풀 수 있다. k번 째 원소를 뽑거나 안 뽑거나에 따라 합이 달라진다.
k번째 원소를 합한 값, 합하지 않은 값을 넘겨 재귀호출한다.
import java.util.*;
public class Main {
static int powerSet(int[] arr, int s, int target, int k) {
int cnt=0;
if(k==arr.length) {
if(s==target)
return 1;
else
return 0;
}
cnt+=powerSet(arr, s, target, k+1);
cnt+=powerSet(arr, s+arr[k], target, k+1);
return cnt;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int s = sc.nextInt();
int[] arr = new int[n];
for(int i=0; i<n; i++)
arr[i] = sc.nextInt();
int count = powerSet(arr, 0, s, 0);
if(s!=0)
System.out.println(count);
else
System.out.println(count-1); //공집합까지 카운트하는 경우
}
}
s가 0인 경우에는 공집합인 경우에도 카운트하므로 1을 빼줘야 한다. 처음에는 이 부분을 생각하지 못해 틀렸다.
'프로그래밍 > 백준 문제풀이' 카테고리의 다른 글
백준 1463: 1로 만들기 (1) | 2022.11.30 |
---|---|
백준 6603: 로또(JAVA) (0) | 2022.11.30 |
백준 10974: 모든 순열 (0) | 2022.10.13 |
백준 10973: 이전 순열(JAVA) (0) | 2022.10.12 |
백준 10972: 다음 순열(JAVA) (0) | 2022.10.12 |