凑硬币是动态规划的一个经典例子,比如有硬币1,3,5,则组合出11有几种方案,最少硬币个数的有几种方案。
网上例子一般都是硬币组合1,3,5,如果不是1开头的就挂了,比如硬币组合是2,5,8,自己编写了支持所有硬币组合的代码。
有两个例子:
输出和等于target的最小个数硬币组合
/**
* 输出和等于target的最小个数硬币组合
* @param coins 硬币有哪几种,如{1,3,5}
* @param target 硬币和等于多少,如13
*/
private static void calcMinCoins(int [] coins, int target)
输出和等于target的所有硬币组合
/**
* 输出和等于target的所有硬币组合
* @param coins 硬币有哪几种,如{1,3,5}
* @param target 硬币和等于多少,如13
*/
private static void calcAllCoins(int [] coins, int target)
调用函数
public static void main(String[] args) {
calcMinCoins(new int[]{2,5,8}, 50);
calcAllCoins(new int[]{2,5,8}, 50);
}
具体代码如下:
/**
* 输出和等于target的最小个数硬币组合
* @param coins 硬币有哪几种,如{1,3,5}
* @param target 硬币和等于多少,如13
*/
private static void calcMinCoins(int [] coins, int target) {
Map map = new HashMap<>();
for(int i=0;i<=target;i++){
List listi = (List)map.get(i);//所有和等于i的组合
if(listi == null){//若没有则初始化
listi = new ArrayList();
map.put(i,listi);
}
if(i == 0){//所有和等于0的组合是一个空组合
listi.add(new ArrayList());
}
for(int coin : coins