JAVA算法:零钱兑换问题求解
问题描述:给定一个数值N,代表钱数。在给定一个表示零钱的子集,S = { S1, S2, … , Sm}
问题是使用子集中的元素进行零钱兑换,存在多少种兑换方法?零钱的顺序不用考虑。
举例一:给定数值4,和子集 S = {1,2,3} 那么存在4中兑换方法: {1,1,1,1},{1,1,2},{2,2},{1,3}
举例二:给定数值10,和子集 S = {2, 5, 3, 6} 那么存在5种兑换方法:{2,2,2,2,2}, {2,2,3,3},
{2,2,6}, {2,3,5} and {5,5}.
编写一个算法解决这个问题。
算法设计(1)
package com.bean.algorithm.basic;
public class CoinsChangeDemo3 {
// Recursive java program for
// coin change problem.
// Returns the count of ways we can
// sum S[0...m-1] coins to get sum n
static int count(int S[], int m, int n) {
// If n is 0 then there is 1 solution
// (do not include any coin)
if (n == 0)
return 1;
// If n is less than 0 then no
// solution exists
if (n < 0)
return 0;
// If there are no coin