原文链接:http://blog.csdn.net/baidu_23318869/article/details/50891006
问题链接:https://leetcode.com/problems/coin-change/
代码如下:
- // CPP
- class Solution {
- public:
- int coinChange(vector<int>& coins, int amount) {
- if (amount == 0) {
- return 0;
- }
- // 初始化数组为 0,并将已有钱数置为 1
- // initialized vector f with 0 then fill the coin value as 1
- vector<int> f(amount + 1, 0);
- for (int i = 0; i < coins.size(); ++i) {
- if (coins[i] <= amount) {
- f[coins[i]] = 1;
- }
- }
- // 在能够凑出钱数目的基础上,计算出新的可凑出的钱数,并更新其需要的张数
- // for every value which can be added up to, calculate new value and refresh new value's times
- for (int pos = 0; pos <= amount; ++pos) {
- if (f[pos] == 0) {
- continue;
- }
- for (int i = 0; i < coins.size(); ++i) {
- int value = pos + coins[i];
- if (value <= amount) {
- f[value] = (f[value] == 0) ?
- (f[pos] + 1) : min(f[value], f[pos] + 1);
- }
- }
- }
- return (f[amount] == 0) ? -1 : f[amount];
- }
- };
- // JAVA
- public class Solution {
- public int coinChange(int[] coins, int amount) {
- if (amount == 0) {
- return 0;
- }
- int[] f = new int[amount + 1];
- for (int i = 0; i < coins.length; ++i) {
- if (coins[i] <= amount) {
- f[coins[i]] = 1;
- }
- }
- for (int pos = 0; pos <= amount; ++pos) {
- if (f[pos] == 0) {
- continue;
- }
- for (int i = 0; i < coins.length; ++i) {
- int value = pos + coins[i];
- if (value <= amount) {
- f[value] = (f[value] == 0) ?
- (f[pos] + 1) : Math.min(f[value], f[pos] + 1);
- }
- }
- }
- return (f[amount] == 0) ? -1 : f[amount];
- }
- }