『アルゴリズムとデータ構造』を Rust で実装してみるシリーズ。4章の再帰と分割統治法。
前回 → https://quantized-cube.com/rust-recursive-03
今回は 部分和問題。
use proconio::input;
fn input(use_default_values: bool) -> (usize, u64, Vec<u64>) {
if use_default_values {
let n = 4;
let w = 14;
let a = vec![3, 2, 6, 5];
return (n, w, a);
} else {
println!("Input n and a:");
input! {
n: usize,
w: u64,
a: [u64; n],
}
return (n, w, a);
}
}
fn func(i: usize, w: i64, a: &Vec<u64>) -> bool {
// ベースケース
if i == 0 {
if w == 0 {
return true;
} else {
return false;
}
}
// a[i - 1] を選ばない場合
if func(i - 1, w, a) {
return true;
}
// a[i - 1] をぶ場合
if func(i - 1, w - a[i - 1] as i64, a) {
return true;
}
// どちらも false の場合は false
return false;
}
/// 部分和問題を再帰関数を用いる全探索で解く
pub fn code_4_9(use_default_values: bool) -> String {
// 入力
let (n, w, a) = input(use_default_values);
// 再帰的に解く
if func(n, w as i64, &a) {
String::from("Yes")
} else {
String::from("No")
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn code_4_9_works() {
assert_eq!(code_4_9(true), String::from("Yes"));
}
}
GitHub のリポジトリはこちら https://github.com/quantized-cube/book_algorithm_solution_rust
コメント