Problem:
A: four tea

問題

プログラミングコンテストにはお茶が欠かせない。お茶にはコンテスタントの緊張を和らげる作用があるのだ [要出典]

コンテストに参加する選手が N 人いるので、この人数分のお茶を用意したいと考えている。お茶のパッケージは A, B, C, D の 4 種類あり、どれも同じ品種であるが内容量が異なる。あるパッケージ X について、そのパッケージ 1 つ分の値段は p_X 円であり、1 つ買うと t_X 杯分のお茶を作れることがわかっている。

N 人分のお茶を作るために必要な金額の最小値を求めよ。なお、全く購入しないパッケージがあってもよく、ちょうど N 人分になるようにパッケージを購入する必要もない (N 人分以上作れれば良い)。

入力形式

入力は以下の形式で与えられる。

N
p_A p_B p_C p_D
t_A t_B t_C t_D

1 行目ではコンテストに参加する選手の人数が与えられる。

2 行目では、パッケージ A, B, C, D のお茶の価格が空白区切りで与えられる。

3 行目では、パッケージ A, B, C, D からお茶が何杯作ることができるか空白区切りで与えられる。

制約

1 \leq N \leq 100

1 \leq p_X \leq 100

1 \leq t_X \leq 100

全ての入力は整数として与えられる。

出力形式

N 人分のお茶を作るために必要な金額の最小値を 1 行で出力せよ。

入力例1

10
1 2 3 4
1 2 4 8

出力例1

6

パッケージ B を 1 つ、D を 1 つ買うのが最適である。

入力例2

5
2 9 9 8
1 4 5 100

出力例2

8

必要な量の 20 倍のお茶を用意することになるが、パッケージ D を 1 つ買う場合が最も安く 5 杯以上のお茶を用意できる。

入力例3

24
2 3 4 7
7 9 11 20

出力例3

8

パッケージ A を 2 つと C を 1 つ買うのが最適である。このケースのように人数分のお茶をちょうど作ることが出来ないこともある。

Solution in Rust (judge verdict: Accepted)

#[allow(dead_code)]
fn read<T: std::str::FromStr>() -> T {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).ok();
    s.trim().parse().ok().unwrap()
}

#[allow(dead_code)]
fn read_vec<T: std::str::FromStr>() -> Vec<T> {
    read::<String>()
        .split_whitespace()
        .map(|e| e.parse().ok().unwrap())
        .collect()
}

#[allow(dead_code)]
fn read_vec2<T: std::str::FromStr>(n: u32) -> Vec<Vec<T>> {
    (0..n).map(|_| read_vec()).collect()
}

#[allow(dead_code)]
fn yn(result: bool) {
    if result {
        println!("Yes");
    } else {
        println!("No");
    }
}

fn main() {
    let n = read::<u32>();

    let p = read_vec::<u32>();
    let t = read_vec::<u32>();

    let mut ans = 100000;
    for i in 0..n + 1 {
        for j in 0..n + 1 {
            for k in 0..n + 1 {
                for l in 0..n + 1 {
                    if t[0] * i + t[1] * j + t[2] * k + t[3] * l >= n {
                        let ps = p[0] * i + p[1] * j + p[2] * k + p[3] * l;
                        ans = std::cmp::min(ans, ps);
                    }
                }
            }
        }
    }
    println!("{}", ans);
}