Solution

Memo

  • 브루트포스 조합 문제
  • 비트마스킹으로 풀 수 있다는 풀이를 보기는 했지만 오랫만이라 잘 되지 않았다.
// Baekjoon - 1182
// https://www.acmicpc.net/problem/1182

use std::io::{self, Read, Write};

fn combination(
    vec: &Vec<i32>,
    selected: &mut Vec<i32>,
    idx: usize,
    level: usize,
    sum: i32,
    count: &mut i32,
) {
    if selected.len() == level {
        let total: i32 = selected.iter().sum();
        if total == sum {
            *count += 1;
        }
        return;
    }

    for i in idx..vec.len() {
        selected.push(vec[i]);
        combination(vec, selected, i + 1, level, sum, count);
        selected.pop();
    }
}

fn main() {
    let mut input = String::new();
    io::stdin().read_to_string(&mut input).unwrap();
    let mut lines = input.lines();
    let stdout = io::stdout();
    let mut stdout = stdout.lock();

    let first_line = lines.next().unwrap();
    let mut parts = first_line.split_whitespace();
    let cnt: usize = parts.next().unwrap().parse().unwrap();
    let sum: i32 = parts.next().unwrap().parse().unwrap();

    let numbers_line = lines.next().unwrap();
    let vec: Vec<i32> = numbers_line
        .split_whitespace()
        .map(|s| s.parse::<i32>().unwrap())
        .collect();

    let mut total_count = 0;

    for level in 1..=cnt {
        let mut selected = Vec::new();
        combination(&vec, &mut selected, 0, level, sum, &mut total_count);
    }

    write!(stdout, "{}", total_count).unwrap();
}