結果
問題 |
No.2026 Yet Another Knapsack Problem
|
ユーザー |
|
提出日時 | 2025-05-26 19:27:02 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 1,253 ms / 10,000 ms |
コード長 | 1,239 bytes |
コンパイル時間 | 11,654 ms |
コンパイル使用メモリ | 405,696 KB |
実行使用メモリ | 51,072 KB |
最終ジャッジ日時 | 2025-05-26 19:27:24 |
合計ジャッジ時間 | 22,111 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 42 |
ソースコード
fn getline() -> String { let mut ret = String::new(); std::io::stdin().read_line(&mut ret).ok().unwrap(); ret } const INF: i64 = 1 << 60; // https://yukicoder.me/problems/no/2026 (4) // O(N^2 log^2 N) fn main() { let n: usize = getline().trim().parse().unwrap(); let mut cv = vec![]; for _ in 0..n { let v: Vec<i64> = getline().trim().split_whitespace().map(|x| x.parse().unwrap()).collect(); cv.push((v[0] as usize, v[1])); } let mut dp = vec![vec![-INF; n + 1]; n + 1]; dp[0][0] = 0; for i in (1..=n).rev() { let (c, v) = cv[i - 1]; let mut c = c.min(n / i); // decompose let mut w = vec![]; let mut cur = 1; while c > 0 { let r = cur.min(c); w.push(r); c -= r; cur *= 2; } for w in w { for j in (i * w..=n).rev() { for k in 0..=(j / i).min(n - w) { dp[k + w][j] = dp[k + w][j].max(dp[k][j - i * w] + v * w as i64); } } } } for k in 1..=n { let mut ans = -INF; for j in 0..=n { ans = ans.max(dp[k][j]); } println!("{ans}"); } }