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表示當前數不可以用

數組的硬幣數湊整!!!

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