結果
| 問題 | No.527 ナップサック容量問題 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2017-07-23 21:37:39 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
AC
|
| 実行時間 | 15 ms / 2,000 ms |
| コード長 | 1,574 bytes |
| 記録 | |
| コンパイル時間 | 13,418 ms |
| コンパイル使用メモリ | 399,840 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-10-09 11:04:58 |
| 合計ジャッジ時間 | 15,424 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 37 |
ソースコード
use std::io::stdin;
use std::cmp::max;
struct Object {
v: usize,
w: usize
}
fn main(){
let n = getvec()[0];
let vws = (|| {
let mut vws: Vec<_> = Vec::new();
for _ in 0..n {
let vw = getvec();
vws.push(Object{v: vw[0], w: vw[1]});
}
vws
})();
let v = getvec()[0];
let (w_min, w_max) = solve(&vws, v);
println!("{}", if v==0 {1} else {w_min});
if w_max==-1 {
println!("inf");
} else {
println!("{}", w_max);
}
}
fn solve(vws: &Vec<Object>, v_max: usize) -> (i64, i64) {
let mut dp: Vec<usize> = Vec::new();
for _ in 0..100_000 { dp.push(0) }
for &Object{v, w} in vws {
for i in (0..(100_000 as i64 - w as i64) as usize).rev() {
dp[i+w] = max(dp[i+w], dp[i]+v);
}
}
let mut w_min = -1;
let mut w_max = -1;
for (i, &v) in dp.iter().enumerate() {
if w_min==-1 && v==v_max {
w_min = i as i64;
} else if w_min !=-1 && v > v_max {
w_max = i as i64 -1;
break;
}
}
(w_min, w_max)
}
#[allow(dead_code)]
fn getline() -> String {
let mut s = String::new();
match stdin().read_line(&mut s){
Ok(_) => {s.trim().to_string()}
Err(_) => String::new()
}
}
#[allow(dead_code)]
fn getvec<T: std::str::FromStr>() -> Vec<T>{
let line = getline();
line.split_whitespace().filter_map(|x| x.parse().ok()).collect()
}
#[allow(dead_code)]
fn getpair() -> (usize, usize){
let nm = getvec();
(nm[0], nm[1])
}