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: Time Limit Exceeded)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Linq;

class Program
{
	static int n;
	static int m;
	static int[] cs;
	static int[] minCounts;

	static void Main(string[] args)
	{
		string[] first = Console.ReadLine().Split();

		n = int.Parse(first[0]);
		m = int.Parse(first[1]);

		cs = Console.ReadLine().Split().Select(str => int.Parse(str)).ToArray();

		minCounts = new int[50001];

		// コイン1枚で実現できる金額には枚数1を入れておく
		for (int ci = 0; ci < m; ci++)
		{
			minCounts[cs[ci]] = 1;
		}

		// 1から順番に辿る
		for (int i = 1; i <= n; i++)
		{
			minCounts[i] = GetMinCounts(i);
		}
		System.Console.WriteLine(minCounts[n]);
	}

	// Kを実現する最小コイン枚数を返す
	static int GetMinCounts(int k)
	{
		// 記録済み
		int minCount = minCounts[k];
		if (minCount > 0) return minCount;

		// 頭と後ろからの組み合わせで最小値を計算
		int min = GetMinCounts(1) + GetMinCounts(k - 1);
		for (int j = 2; j < k / 2 + 1; j++)
		{
			int current = GetMinCounts(j) + GetMinCounts(k - j);
			if (current < min) min = current;
		}
		return min;
	}
}