public class Test {
public static int sum = 21;//硬币总和
public static int n = 4;//硬币类型数
public static int[] min = new int[sum+1];//存储每个总和需要的最小硬币个数
public static int[] coin = {2,3,5,10};//硬币币值数组
public static void main(String[] args){
init();
findmin();
System.out.println(min[sum]);//打印出组合成改Sum的最少硬币数
print_ans(sum);
}
//初始化min,为每个总和,设置一个较大的初始值
public static void init(){
for(int i=1;i <= sum; i++){
min[i] = 100000;
}
}
/*
* 查找每个总和,需要的最少硬币个数
* 如果各种硬币不能组合成该总和,则存储着初始值
*/
public static void findmin(){
for(int i=1;i<=sum;i++){//遍历每种总和
for(int j=0;j
if(i>=coin[j]){//如果该硬币币值,比要组成的总和大
/*
* 下面类似递归的思想
* 假设我们知道了某个总和需要的最小硬币数
* 那么当我们确定了一个硬币coin[j],那么我剩下的,就是要求“当前要求总和减去这个硬币(min[i-coin[j]])”的最少硬币数
* 而我们根据递归的思想,我们是已经知道了min[i-coin[j]]
* 所以我们接下来判断,min[i-coin[j]]+1(因为要多加一个硬币coin[j]),是否比原来存储的小,如果是,则更新这个值
*/
if(min[i-coin[j]]+1
min[i] = min[i-coin[j]]+1;
}
}
}
}
}
public static void print_ans(int s){//打印出最小数目
for(int i=0;i
if(s>coin[i] && min[s]==min[s-coin[i]]+1){
System.out.println(coin[i]);
print_ans(s-coin[i]);
break;
}
}
}
}