π [λ°±μ€μκ³ λ¦¬μ¦ νμ΄] Q.1182 λΆλΆμμ΄μ ν© λ¬Έμ νμ΄
π λ¬Έμ
https://www.acmicpc.net/problem/1182
Nκ°μ μ μλ‘ μ΄λ£¨μ΄μ§ μμ΄μ΄ μμ λ, ν¬κΈ°κ° μμμΈ λΆλΆμμ΄ μ€μμ
κ·Έ μμ΄μ μμλ₯Ό λ€ λν κ°μ΄ Sκ° λλ κ²½μ°μ μλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯
첫째 μ€μ μ μμ κ°μλ₯Ό λνλ΄λ Nκ³Ό μ μ Sκ° μ£Όμ΄μ§λ€. (1 β€ N β€ 20, |S| β€ 1,000,000)
λμ§Έ μ€μ Nκ°μ μ μκ° λΉ μΉΈμ μ¬μ΄μ λκ³ μ£Όμ΄μ§λ€. μ£Όμ΄μ§λ μ μμ μ λκ°μ 100,000μ λμ§ μλλ€.
μΆλ ₯
첫째 μ€μ ν©μ΄ Sκ° λλ λΆλΆμμ΄μ κ°μλ₯Ό μΆλ ₯νλ€.
π μ κ·Όλ²
Q.1182 λΆλΆμμ΄μ ν© λ¬Έμ νμ΄μ λλ€.
λΆλΆμμ΄μ μ°μλμ§ μμλ λκΈ° λλ¬Έμ λͺ¨λ κ²½μ°λ₯Ό μ΄ν΄λ³΄μμΌ ν©λλ€.
μμ νμμ ν΅ν΄ νμ΄μΌ νλλ°
κ·Έμ€μμλ κ³±μ μ΄λ λλμ κ°μ κ²μ΄ μκ³ μ€λ‘μ§ ν©μ΄λ―λ‘
λΆλΆμμ΄μ μ ννλ μμκ° μκ΄μ΄ μμ΅λλ€.
μ¦, μμμ μκ΄μλ μ ν λ¬Έμ λ‘
μ‘°ν©μΌλ‘ Nκ° μ€ 1κ°λΆν°~Nκ°κΉμ§ λ½λ λͺ¨λ κ²½μ°μ μλ₯Ό λ½κ³ (nC1 . . . nC2 . . . nCn)
κ·Έ μ€ μ νν λΆλΆμμ΄μ ν©μ΄ μ£Όμ΄μ§ Sμ κ°μ λ
countλ₯Ό λλ €μ£Όλ©΄ λ΅μ λμΆν μ μμ΅λλ€.
π» μ½λ
package problem.brute;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main_1182 {
static int n, s;
static int[] nums;
static int count = 0;
public static void main(String[] args) throws IOException {
input();
solve();
System.out.println(count);
}
public static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String [] input = br.readLine().split(" ");
n = Integer.parseInt(input[0]);
s = Integer.parseInt(input[1]);
nums = new int[n];
String[] temp = br.readLine().split(" ");
for(int i=0; i<n; i++){
nums[i] = Integer.parseInt(temp[i]);
}
}
public static void solve() {
boolean[] visited = new boolean[n];
for(int i=1; i<=n ; i++){
combination(nums, visited, 0, n,i);
}
}
static void combination(int[] arr, boolean[] visited, int depth, int n, int r) {
if (r == 0) {
//λ€ λ½μ λΆλΆμμ΄μ λν΄ ν©μ κ³μ°
caculate(arr, visited, n);
return;
}
if (depth == n) {
return;
}
visited[depth] = true;
combination(arr, visited, depth + 1, n, r - 1);
visited[depth] = false;
combination(arr, visited, depth + 1, n, r);
}
static void caculate(int[] arr, boolean[] visited, int n) {
int sum = 0;
for (int i = 0; i < n; i++) {
if (visited[i]) {
sum+=arr[i];
}
}
if(sum==s){
count++;
}
}
}