给定K种面值c1,c2,....ck,每种金币数量,例举总和为amount的,至少需要的金币的组合
关于计算金币数量有解法,金币组合方式可以参考,暴力解,从小到大,找到即是最小组合
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
/**
* description: 凑零钱问题
*/
public class CionN {
public static List<List<Integer>> res = new LinkedList<>();
public static void main(String[] args) {
LinkedList<Integer> integers = new LinkedList<>(Arrays.asList(1, 2, 1, 3, 4, 5, 8, 10, 20, 7, 6, 5, 3));
for (int i = 1; i <= integers.size(); i++) {
backTrack(integers, new LinkedList<>(), i, 9);
if (res != null&&res.size()>0) {
System.out.println(res);
System.out.println(i);
break;
}else {
res.clear();
}
}
}
public static void backTrack(LinkedList<Integer> data, LinkedList<Integer> track, int size, int sum) {
if (track != null && track.stream().mapToInt(o -> o).sum() == sum&&track.size()==size) {
res.add(new LinkedList<>(track));
return;
}
//过滤条件
if (track.stream().mapToInt(o -> o).sum() > sum||track.size()>size) {
return;
}
for (int i = 0; i < data.size(); i++) {
if (track.stream().mapToInt(o -> o).sum() > sum||track.size()>size) {
continue;
}
track.add(data.get(i));
backTrack(data, track,size, sum);
track.removeLast();
}
}
结果:
[[1, 8], [2, 7], [1, 8], [3, 6], [4, 5], [4, 5], [5, 4], [8, 1], [8, 1], [7, 2], [6, 3], [6, 3], [5, 4], [3, 6]]
最少次数
动态规划算法实现
/**
* description: 硬币 coins s=[1 ,3 ,5] 金额 11
*/
public class CoinSum {
public static void main(String[] args) {
int[] coins = {1, 3, 5};
int amount = 11;
System.out.println( getCoinTimes(coins, amount));
}
public static int getCoinTimes(int[] coins,int amount){
int[] dp = new int[amount + 1];
for (int i = 0; i < dp.length; i++) {
dp[i] = amount+1;
}
dp[0] = 0;
for (int i = 0; i < dp.length; i++) {
for (int coin : coins) {
if (i - coin < 0) {
continue;
}
dp[i] = Math.min(dp[i], 1 + dp[i - coin]);
}
}
return dp[amount]==amount+1?-1:dp[amount];
}
}