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 C# (judge verdict: Accepted)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Linq;
using System.Diagnostics;
using System.Globalization;

//問題 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DPL_1_A&lang=jp
namespace templete
{
    class CoinChanging
    {
        static void Main(string[] args)
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int n = input[0]; //値段
            int m = input[1]; //コインの種類
            int[] c = Console.ReadLine().Split().Select(int.Parse).ToArray();

            int[,] dp = new int[m+1, n+1];

            //コインの数の0種類のときはmaxvalue
            for(int i=0; i<=n; i++){
                dp[0,i] = int.MaxValue;
            }

            //0円のときは0
            for(int i=0; i<=m; i++){
                dp[i,0] = 0;
            }

            for(int i=1; i<=m; i++){
                for(int j=0; j<=n; j++){
                    if(j-c[i-1]<0){
                        dp[i,j] = dp[i-1,j];
                    }else{
                        dp[i,j] = Math.Min(dp[i-1,j], dp[i,j-c[i-1]]+1);
                    }
                }
            }

            Console.WriteLine(dp[c.Length, n]);

            //string[] str = Console.ReadLine().Split(' ');
            //string str = Console.ReadLine();

            //Write("改行なし a = {0} b = {1} c = {2}", a, b, c);
            //WriteLine("改行あり a = {0} b = {1} c = {2}", a, b, c);
            //WriteLine($"答えは{input[0]+input[1]}");
        }

        /// 値のスワップ
        static void Swap<T>(ref T lhs, ref T rhs)
        {
            T temp;
            temp = lhs;
            lhs = rhs;
            rhs = temp;
        }


    }
}