最近遇到了一道挺有意思的算法题:四种硬币 1元3元4元5元 ,问:想要凑成n元钱最少几枚硬币?
public class CoinsGameMain {
public static void main(String[] args) {
int[] is = {1,3,4,5};
fun(7,is);
}
public static void fun(int k, int[] is){
int[] i1 = new int[99];
for (int l=0;l<k+1;l++){
if(l==0){
i1[0] = 0;
} else {
int[] i2 = new int[4];
for (int j=0;j<is.length;j++){
int ks = l - is[j];
if(ks >=0){
i2[j] = i1[ks]+1;
}
}
i1[l] = min(i2);
}
if (l==k){
System.out.println((k)+":"+i1[l]);
}
}
}
private static int min(int[] i1){
if (i1.length==0) return 0;
int m = i1[0];
for (int i=0;i<i1.length;i++){
if(i1[i]!=0&&i1[i]<m){
m=i1[i];
}
}
return m;
}
}
使用的是动态规划法,动态规划法的思路是:利用上一个结果的值来获取下一个结果没听起来很玄乎,用这道题举例,想要知道99元最少需要多少枚硬币的话,我需要知道:1元需要多少,2元需要多少,3元需要多少,4元...,最后才能知道99元需要多少。
算法思路
fun(n-1)+1,fun(n-3)+1,fun(n-4)+1,fun(n-5)+1之中最小的,已知fun(0)=0;
所以要想知道fun(99)=?,fun(0) fun(1) fun(2) ... fun(99)