列表

详情


BM70. 兑换零钱(一)

描述

给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。
如果无解,请返回-1.

数据范围:数组大小满足 , 数组中每个数字都满足

要求:时间复杂度 ,空间复杂度

示例1

输入:

[5,2,3],20

输出:

4

示例2

输入:

[5,2,3],0

输出:

0

示例3

输入:

[3,5],2

输出:

-1

原站题解

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

C++ 解法, 执行用时: 5ms, 内存消耗: 412KB, 提交时间: 2022-03-08

class Solution {
public:
    /**
     * 最少货币数
     * @param arr int整型vector the array
     * @param aim int整型 the target
     * @return int整型
     */
    int minMoney(vector<int>& arr, int aim) {
        vector<int> f(aim + 1, 1e8);
        
        f[0] = 0;
        for (auto x : arr) {
            for (int j = x; j <= aim; j ++ ) 
                f[j] = min(f[j], f[j - x] + 1);
        }
        
        if (f[aim] == 1e8) return -1;
        return f[aim];
    }
};

C 解法, 执行用时: 5ms, 内存消耗: 420KB, 提交时间: 2022-03-06

/**
 * 最少货币数
 * @param arr int整型一维数组 the array
 * @param arrLen int arr数组长度
 * @param aim int整型 the target
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int minMoney(int* arr, int arrLen, int aim ) {
    int result = 0;
    int flag = 1;
    if(aim==0) return 0;
    if(arrLen==0) return -1;
    int sum[aim+1], tmp;
    for(int i=1;i<=aim;i++) sum[i] = 0;
    for(int i=0;i<arrLen;i++) {
        if(arr[i]<=aim) {
            if(arr[i]==aim) return 1;
            sum[arr[i]] = 1;
        }
    }
    
    while(flag) {
        result++;
        flag = 0;
        for(int i=1;i<=aim;i++) {
            if(sum[i]==result) {
                for(int j=0;j<arrLen;j++) {
                    tmp = i+arr[j];
                    if(tmp<=aim && sum[tmp]==0) {
                        if(tmp==aim) return result+1;
                        sum[tmp] = result+1;
                        flag = 1;
                    }
                }
            }
        }
    }
    
    return -1;
}

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

class Solution {
public:
    /**
     * 最少货币数
     * @param arr int整型vector the array
     * @param aim int整型 the target
     * @return int整型
     */
    int minMoney(vector<int>& arr, int aim) {
        if(aim == 0)    return 0;
        
        int dp[aim+1];
        dp[0] = 0;
        for(int i = 1; i <= aim; ++i)    dp[i] = INT_MAX-1;
        for(int i = 0; i < arr.size(); ++i)
            for(int j = arr[i]; j <= aim; ++j)
                dp[j] = min(dp[j], dp[j-arr[i]] + 1);
        
        if(dp[aim] == INT_MAX-1)    return -1;
        
        return dp[aim];
        
    }
};

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

//lc322 类完全背包
class Solution {
public:
    /**
     * 最少货币数
     * @param arr int整型vector the array
     * @param aim int整型 the target
     * @return int整型
     */
    int minMoney(vector<int>& arr, int aim) {
        // write code here
        //f[j]表示前i中硬币凑总金额为j,硬币的最少个数
        vector<int> f(aim + 1, 1e9);
        f[0] = 0;
        for(auto c : arr){
            for(int i = c; i <= aim; ++ i){
                f[i] = min(f[i], f[i - c] + 1);
            }
        }
        if(f[aim] == 1e9) return -1;
        return f[aim];
    }
};

C++ 解法, 执行用时: 5ms, 内存消耗: 428KB, 提交时间: 2022-07-26

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 最少货币数
     * @param arr int整型vector the array
     * @param aim int整型 the target
     * @return int整型
     */
    int minMoney(vector<int>& arr, int aim) {
        // write code here
        sort(arr.begin(),arr.end());
        if(aim<1)
            return 0;
        vector<int>dp(aim+1,aim+1);
        dp[0]=0;
        for(auto i: arr)
        {
            for(int j=i;j<=aim;++j)
                dp[j]=min(dp[j],dp[j-i]+1);
        }
        
        return dp[aim]>aim?-1:dp[aim];
    }
};

上一题