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 JAVA (judge verdict: Wrong Answer)



import java.util.Arrays;
import java.util.Scanner;

public class Main {
	int n, m;
	long[] coins;
	long[][] dp;
	public static void main(String[] args){
		Main inst = new Main();
		inst.solve();
	}
	
	public void solve(){
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		m = sc.nextInt();
		coins = new long[m];
		long[] temp = new long[m];
		dp = new long[m][n+1];
		for(int i = 0;i < m;++i){
			temp[i] = sc.nextInt();
		}
		Arrays.sort(temp);
		for(int i = 0;i < m;++i){
			coins[i] = temp[m - i - 1];
		}
		System.out.println(this.calc(0, n));
	}
	
	//step?????????????????§?????????z????????£?????¨??????????°?????????°
	public long calc(int step, int z){
		if(step >= this.m-1){
			return z;
		}
		
		if(dp[step][z] > 0) return dp[step][z];
		
		long fuga = Math.min(calc(step+1, (int) (z % coins[step])) + (z/coins[step]), calc(step+1, z));
		dp[step][z] = fuga;
		return fuga;
		
	}
}