一、问题介绍
给定数组 arr,arr 中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数 aim,代表要找的钱数,求所有的找零方法有多少种。
二、算法思路
枚举法,列出使用某张钞票n次的所有可能。
1、暴力递归
int process1(int n,int arr[], int index, int rest)
{
if (index == n)
return rest == 0 ? 1 : 0;
int ways = 0;
//枚举选择每种货币张的情况
for (int zhang = 0; arr[index] * zhang <= rest; zhang++)
ways += process1(n, arr, index + 1, rest - zhang * arr[index]);
return ways;
}
2、动态规划
每一个位置都依赖它下面从左往右的位置。所有每行从左往右,整体从下往上。
int dp[100][100];
int process2(int n, int arr[], int aim)
{
if (arr == NULL || n == 0)
return 0;
dp[n][0] = 1;
for (int index = n - 1; index >= 0; index--)
{
for (int rest = 0; rest <= aim; rest++)