#define MONEY 100
int COINS;
//递归
//
int findCoinExchange1(int* coins, int coinId, int curMoney) {
/*钱数刚好兑换完,即这跳路径是满足的情况*/
if (curMoney == 0) {
return 1;
}
/*curMoney<0为凑不齐的情况;
* coinId==COINS表示所给的币值无法凑为要求的币值*/
if (!coins || curMoney < 0 || coinId == COINS) {
return 0;
}
/*findCoinExchange1(coins, coinId + 1, curMoney)表示不放coinId的情况;
*findCoinExchange1(coins, coinId, curMoney - coins[coinId])表示放入coinId的情况 */
return findCoinExchange1(coins, coinId + 1, curMoney)
+ findCoinExchange1(coins, coinId, curMoney - coins[coinId]);
}
//非递归
/* j表示金钱价值
* ways[j]表示不包含coins[i]时能达到ways[j]的情况,
* ways[j-coins[i]]表示包含coins[i]时达到ways[j]的情况,
* 则ways[MONEY]为结果
* 所以必须声明ways[MONEY+1]
* */
int findCoinExchange2(int* coins) {
if (!coins)
return 0;
int ways[MONEY + 1] = { 1 };
for (int i = 0; i < COINS; ++i) {
for (int j = coins[i]; j <= MONEY; ++j) {
ways[j] += ways[j - coins[i]];
}
}
return ways[MONEY];
}