亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

蟲蟲首頁| 資源下載| 資源專輯| 精品軟件
登錄| 注冊

您現在的位置是:首頁 > 技術閱讀 >  每日一題:零錢兌換

每日一題:零錢兌換

時間:2024-02-14

給定不同面額的硬幣 coins 和一個總金額 amount。編寫一個函數來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。

示例1:

輸入: coins = [1, 2, 5], amount = 11輸出: 3解釋: 11 = 5 + 5 + 1

示例2:

輸入: coins = [2], amount = 3輸出: -1

說明:

你可以認為每種硬幣的數量是無限的。

分析

這題可以用貪心也可以用dp,這里使用dp方式,以示例1舉例,如下圖


有硬幣[1, 2, 5],想要組成11,那就需要先組成(11-1, 11-2, 11-5),即(10, 9, 6),括號內為或關系,就是說想要組成11,那就需要先組成10或9或6,這里用dp存儲組成x需要的硬幣個數,則dp[11]= min(dp[10], dp[9], dp[6])+1,依此類推,dp[10] = min(dp[10-1], dp[10-2], dp[10-5]) + 1,這是從上向下類推,基本上從上向下類推的規律都可以從下向上推導,具體可以看代碼啦。

代碼

class Solution {public:    int coinChange(vector<int>& coins, int amount) {        if (amount == 0) return 0;        // 如果沒有任何一種硬幣組合能組成總金額,返回 -1        const int fail_value = -1;        vector<int> dp(amount + 1, fail_value);        std::sort(coins.begin(), coins.end());        for (int i = 1; i <= amount; ++i) {            for (auto coin : coins) {                if (i == coin) {                    dp[i] = 1;                    break;                }                if (i < coin) {                    break;                }                if (dp[i-coin] != fail_value) {                    if (dp[i] == fail_value) {                        dp[i] = dp[i-coin] + 1;                    } else {                        dp[i] = min(dp[i-coin] + 1, dp[i]);                    }                }            }        }        return dp[amount];    }};

如有任何問題,可以聯系喵大人 ,我會盡快回復噠!

主站蜘蛛池模板: 赞皇县| 如东县| 枣阳市| 兖州市| 大厂| 平泉县| 沙洋县| 辽阳县| 胶州市| 嘉禾县| 梅河口市| 扎赉特旗| 色达县| 环江| 兴安县| 探索| 广安市| 吴桥县| 徐闻县| 康乐县| 平顶山市| 柳林县| 盐城市| 宝应县| 崇仁县| 大英县| 伊金霍洛旗| 浮山县| 沙河市| 弥渡县| 栾城县| 镇巴县| 司法| 石泉县| 水富县| 洞头县| 灵寿县| 彭州市| 祁门县| 绥江县| 梓潼县|