fn getline() -> String { let mut inp: String = String::new(); match std::io::stdin().read_line(&mut inp) { Ok(_) => inp.trim().to_string(), Err(e) => format!("{}", e), } } fn main() { let mut inp: String = getline(); inp = getline(); let mut weight: Vec = Vec::new(); let tmp: Vec<_> = inp.split(" ").collect(); for x in tmp { match x.parse::() { Ok(var) => weight.push(var), Err(e) => println!("{}", e), } } let n: usize = weight.len() as usize; let mut half: i32 = weight.iter().fold(0, | half, a | half + a); if half % 2 == 1 { println!("impossible"); } else { half /= 2; let mut dp = [0;6000]; let mut nxt = [0;6000]; dp[0] = 1; for k in 0..n as usize { for i in 0..half as usize { if dp[i] != 1 { continue; } nxt[i] = 1; if i as i32 + weight[k] <= half { nxt[i+weight[k] as usize] = 1; } } dp.copy_from_slice(&nxt); } if dp[half as usize] == 1 { println!("possible"); } else { println!("impossible"); } } }