想兑换100元钱,有1,2,5,10四种钱,问总共有多少兑换方法。
下面提供两种实现方式,其中代码注释的很清楚。
关于动态规划的基本原理,参考:
http://www.cnblogs.com/sdjl/articles/1274312.html
2. 递归解法
-
- #include<iostream>
- using namespace std;
-
- const int N = 100;
- int dimes[] = {1, 2, 5, 10};
- int arr[N+1] = {1};
-
- int coinExchangeRecursion(int n, int m)
- {
- if (n == 0)
- return 1;
- if (n < 0 || m == 0)
- return 0;
- return (coinExchangeRecursion(n, m-1) + coinExchangeRecursion(n-dimes[m-1], m));
-
- }
-
- int main()
- {
- int num=coinExchangeRecursion(N, 4);
- cout<<num<<endl;
-
- int num2=coinExchange(N);
- cout<<num2<<endl;
-
- return 0;
-
- }
3. 非递归解法
-
- #include<iostream>
- using namespace std;
-
- const int N = 100;
- int dimes[] = {1, 2, 5, 10};
- int arr[N+1] = {1};
-
- int coinExchange(int n)
- {
- int i, j;
- for (i = 0; i < sizeof(dimes)/sizeof(int); i++)
- {
- for (j = dimes[i]; j <= n; j++)
-
-
-
- arr[j] += arr[j-dimes[i]];
-
- }
- return arr[n];
- }
-
-
- int main()
- {
- int num=coinExchangeRecursion(N, 4);
- cout<<num<<endl;
-
- int num2=coinExchange(N);
- cout<<num2<<endl;
-
- return 0;
-
- }
大家可以看出来,递归方式求解比较便于理解。当时,我们一定也要掌握非递归方式的实现,虽然它不太好想,例如上面的
- arr[j] += arr[j-dimes[i]];
这一句。当时非递归方式的有效性是有目共睹的!