2
pub fn minimum_difference(nums: Vec<i32>) -> i32 {3
let n = nums.len() / 2;4
let mut cache_left: Vec<Vec<i32>> = vec![vec![]; n + 1];5
let s: i32 = nums.iter().sum();6
for i in 0..(1 << n) as u32 {7
let len_left = i.count_ones() as usize;8
let sum_left = Solution::subsum(i, &nums[..n]);9
cache_left[len_left].push(s - 2 * sum_left);12
cache_left.iter_mut().for_each(|x| x.sort_unstable());14
let mut min_absdiff = i32::max_value();15
for i in 0..(1 << n) as u32 {16
let sum_right = Solution::subsum(i, &nums[n..]);17
let cl = &cache_left[n - i.count_ones() as usize];18
let absdiff = Solution::bsearch_min_absdiff(cl, sum_right);19
min_absdiff = min_absdiff.min(absdiff);24
fn subsum(bitset: u32, nums: &[i32]) -> i32 {25
nums.iter().enumerate().fold(27
|sum, (j, v)| if bitset & (1 << j) != 0 { sum + v } else { sum },31
fn bsearch_min_absdiff(cl: &[i32], sum_right: i32) -> i32 {32
match cl.binary_search(&(2 * sum_right)) {36
(cl[j] - 2 * sum_right).abs()37
} else if j == cl.len() {38
(cl[j - 1] - 2 * sum_right).abs()40
let absdiff_left = (cl[j - 1] - 2 * sum_right).abs();41
let absdiff_right = (cl[j] - 2 * sum_right).abs();42
absdiff_left.min(absdiff_right)