列表

详情


OR12. 换零钱

描述

有一个数组changes,changes中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,对于一个给定值x,请设计一个高效算法,计算组成这个值的方案数。

给定一个int数组changes,代表所有零钱,同时给定它的大小n,另外给定一个正整数x,请返回组成x的方案数,保证n小于等于100且x小于等于10000。

测试样例:
[5,10,25,1],4,15
返回:6
测试样例:
[5,10,25,1],4,0
返回:1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 428KB, 提交时间: 2021-09-09

class Exchange {
public:
    int countWays(vector<int> changes, int n, int x) {
        vector<int> dp(x+1, 0);
        dp[0] = 1;
        for(const auto &coin: changes){
            for(int i = coin; i<=x; ++i){
                dp[i] += dp[i-coin];
            }
        }
        return dp[x];
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 424KB, 提交时间: 2021-11-22

class Exchange {
public:
    int countWays(vector<int> changes, int n, int x) {
        // write code here
        vector<int> dp(x+1);
        dp[0]=1;
        sort(changes.begin(), changes.end());
        for(int coin:changes)
        {
            for(int i=coin; i<=x; i++)
            {
                dp[i]+=dp[i-coin];
            }
        }
        return dp[x];
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 432KB, 提交时间: 2021-09-07

class Exchange {
public:
    int countWays(vector<int> changes, int n, int x) {
        vector<int> dp(x+1,0);
        dp[0] = 1;
        for(int j = 0;j<n;j++)
        {
            for( int i = changes[j];i<=x;i++)
            {
                dp[i]+=dp[i-changes[j]];
            }
        }
        return dp[x];
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 440KB, 提交时间: 2022-05-19

class Exchange {
public:
    int countWays(vector<int> changes, int n, int x) {
        // write code here
                // 初始化
        vector<int> dp(x+1, 0);
        dp[0] = 1;
        //动态规划
        for(int i=0; i<n; i++){
            int value = changes[i];
            for(int j=value; j<=x; j++){
                //将max改为为sum
                dp[j] = dp[j] + dp[j-value];
            }
        }
        return dp[x];
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 448KB, 提交时间: 2021-12-11

class Exchange {
public:
    int countWays(vector<int> changes, int n, int x) {
        // write code here
        vector<int> dp(x+1);
        dp[0] = 1;
        for(int i = 0; i < changes.size(); ++i) {
            for(int j =0; j + changes[i] < x+1; ++j) {
                dp[j+changes[i]] += dp[j];
            }
        }
        return dp[x];
    }
};

上一题