use itertools::Itertools; fn main() { let input = advent::read_numbers(17); println!("17a: {}", container_fittings(&input, 150)); println!("17b: {}", minimum_containers(&input, 150)); } fn container_fittings(input: &[u16], target: u16) -> usize { input.iter() .powerset() .filter(|containers| containers.iter().copied().sum::() == target) .count() } fn minimum_containers(input: &[u16], target: u16) -> usize { let min_count = input.iter() .powerset() .filter(|containers| containers.iter().copied().sum::() == target) .map(|containers| containers.len()) .min() .unwrap(); input.iter() .powerset() .filter(|containers| containers.len() == min_count) .filter(|containers| containers.iter().copied().sum::() == target) .count() } #[cfg(test)] mod tests { use super::*; #[test] fn test() { let input = [20, 15, 10, 5, 5]; assert_eq!(container_fittings(&input, 25), 4); assert_eq!(minimum_containers(&input, 25), 3); } }