Leetcode-322.Coin Change

题目:

You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.

Example 1:
coins = [1, 2, 5], amount = 11
return 3 (11 = 5 + 5 + 1)

Example 2:
coins = [2], amount = 3
return -1.


代码:

class Solution {
public:
	int coinChange(vector<int>& coins, int amount) {
		int size = coins.size();
		if (size == 0||amount==0)return 0;
		vector<int>re(amount+1,-1);
		sort(coins.begin(),coins.end());//排序
		//填表
		int min_num, cur_num,diff;
		for (int i = 1; i <= amount; i++){
			if (find(coins.begin(), coins.end(), i)==coins.end()){//没有找到
				cur_num = 0, min_num = INT_MAX;
				for (int j = 0; j < coins.size(); j++){
					diff = i - coins[j];
					if (diff>=0&&re[diff]!=-1){
						cur_num = re[diff] + 1;
						if (min_num>cur_num)min_num = cur_num;
					}
				}
				if(min_num!=INT_MAX)re[i] = min_num;
			}
			else re[i] = 1;
		}
		return re[amount];
	}
};

Submission Result: Accepted  More Details 

Share your acceptance!


分析:

如果单纯用贪心算法,每次选择最大的情况就会出现错误,例如:

num={2,3,4},9

如果用贪心则前两次会选择4,最后剩下1,在搜索数组的时候没有可以凑整的数,就会返回-1,但是9=2+3+4,应该返回3;

所以这个题典型的思路就是利用动态规划思想:状态转移方程为re[i]=min{ re[i-coins[j]] +1};

假设我们已经求出了tar=n时需要的最少的硬币数,那我们可以用n减去coins数组里的每一个元素,如果差大于或等于0,并且re[i-coins[j]]不等于-1,等于-1表示当前数不可以用

数组的硬币数凑整!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章