题解 | #换钱的最少货币数#

换钱的最少货币数

http://www.nowcoder.com/practice/3911a20b3f8743058214ceaa099eeb45

01背包

class Solution {
public:
    const int inf = 0x3f3f3f3f;
    int minMoney(vector<int>& arr, int aim) {
        int n = arr.size();
        int dp[aim + 1];
        memset(dp, inf, sizeof(dp));
        dp[0] = 0;
        for(int i = 0; i < n; i ++){
            for(int v = arr[i]; v <= aim; v ++){
                dp[v] = min(dp[v], dp[v - arr[i]] + 1);
            }
        }
        return dp[aim] == inf ? -1 : dp[aim];
    }
};

记录具体选择

class Solution {
public:
    const int inf = 0x3f3f3f3f;
    int minMoney(vector<int>& arr, int aim) {
        int n = arr.size();
        int dp[n + 1][aim + 1];
        int choose[n + 1][aim + 1];
        memset(dp, inf, sizeof(dp));
        memset(choose, -1, sizeof(choose));
        dp[0][0] = 0;
        for(int i = 1; i <= n; i ++){
            for(int v = 0; v <= aim; v ++){
                if(v < arr[i - 1]) dp[i][v] = dp[i - 1][v];
                else{
                    if(dp[i - 1][v] > dp[i][v - arr[i - 1]] + 1){
                        dp[i][v] = dp[i][v - arr[i - 1]] + 1;
                        choose[i][v] = i;
                    }else dp[i][v] = dp[i - 1][v];
                }
            }
        }
        if(dp[n][aim] == inf) return -1;
        int i = n, v = aim;
        vector<int> res;
        while(i > 0){
            cout << i << ":" << v << ":" << choose[i][v] << " ";
            if(choose[i][v] != -1){
                i = choose[i][v];
                v -= arr[i - 1];
                res.push_back(arr[i - 1]);
            }else i --;

        }
        cout << endl;
        for(int i = 0; i < res.size(); i ++) cout << res[i] << " ";
        return dp[n][aim] == inf ? -1 : dp[n][aim];
    }
};
全部评论

相关推荐

04-09 11:42
门头沟学院 Java
程序员小假:哥 只有🍋飞才知道有多不容易
投递字节跳动等公司9个岗位 > 双非本科求职如何逆袭 字节求职进展汇总
点赞 评论 收藏
分享
希望被捞的猫头鹰很理智:大概率待遇低怕硕士跑路
点赞 评论 收藏
分享
牛客963010790号:一般是hr拿着老板账号在招人不是真是老板招
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务