-
DP
-
オーブン1個
- sum_{i in 0..N} T_i
-
オーブン2個†
- T = A B, max(sum_{i in A} T_i, sum_{i in B} T_i)
- S = sum_{i in 0..N} T_i とすると
- max(S_A := sum_{i in A} T_i, S - S_A)
- なので, これを最小にする A の割当を決める
- 前者のほうが小さいとすると
- ans = 後者
- S_A S/2
- min S - S_A -> max S_A
- T = A B, max(sum_{i in A} T_i, sum_{i in B} T_i)
use proconio::input;
fn main() {
input! {
n: usize,
ts: [usize; n],
};
let s = ts.iter().sum::<usize>();
let mut dp = vec![vec![false; s + 1]; n + 1];
// dp[i][j] == true: sum of exist A in ts[0..i] == j
for i in 0..n {
dp[i][0] = true;
}
for i in 0..n {
for j in 0..=s {
if j >= ts[i] {
dp[i + 1][j] = dp[i + 1][j] || dp[i][j - ts[i]] || dp[i][j];
}
}
}
let s_a = dp[n][0..=(s / 2)]
.iter()
.enumerate()
.rev()
.find_map(|(i, e)| e.then_some(i))
.unwrap_or(0);
println!("{}", s - s_a);
}
- https://products.sint.co.jp/hubfs/resource/topsic/pgb2022/1_4.pdf
- 杯の蟹(かにみそ, 脚(10本))のおいしさは
- N = 1, 2 * 10
- N = N, 20 ^ 8
- 半分全列挙
- 4杯である分け方 x = T君の総和 - A君の総和の数
- 他方で -x
- マッチ log M