Problem:
Coin Changing Problem

Find the minimum number of coins to make change for n cents using coins of denominations d1, d2,.., dm. The coins can be used any number of times.

Input

n m
d1 d2 ... dm

Two integers n and m are given in the first line. The available denominations are given in the second line.

Output

Print the minimum number of coins in a line.

Constraints

1 ≤ n ≤ 50000

1 ≤ m ≤ 20

1 ≤ denomination ≤ 10000

The denominations are all different and contain 1.

Sample Input 1

55 4
1 5 10 50

Sample Output 1

2

Sample Input 2

15 6
1 2 7 8 12 50

Sample Output 2

2

Sample Input 3

65 6
1 2 7 8 12 50

Sample Output 3

3

Solution in Rust (judge verdict: Accepted)

macro_rules! scan_sub {
    ( $itr:ident, $t:ty ) => {
        let mut buf = String::new();
        let $itr = {
            while buf.trim().len() == 0 {
                buf = String::new();
                std::io::stdin().read_line(&mut buf).unwrap();
            }
            buf.split_whitespace().map(|n| n.parse::<$t>().unwrap())
        };
    };
}

macro_rules! scan {
    ( $x:ident; Vec<$t:ty> ) => {
        scan_sub!(itr, $t);
        let $x = itr.collect::<Vec<_>>();
    };
    ( $( $x:ident ),*; $t:ty ) => {
        scan_sub!(itr, $t);
        let mut itr = itr;
        $(
            let $x = itr.next().unwrap();
        )*
    };
}

use std::cmp::min;

fn coins(c: &mut Vec<usize>, vals: &Vec<usize>, v: usize) -> usize {
    if c[v] != std::usize::MAX { return c[v]; }

    let mut m = std::usize::MAX;
    for &val in vals.iter() {
        if val > v {
            continue;
        } else if val == v {
            return 1;
        } else {
            m = min(m, coins(c, vals, v-val)+1);
        }
    }

    c[v] = m;
    return m;
}

fn main() {
    scan!(n, _m; usize);
    scan!(values; Vec<usize>);

    let mut coins_vec = vec![std::usize::MAX; n+1];

    println!("{}", coins(&mut coins_vec, &values, n));
}