換錢的最少貨幣數

https://www.nowcoder.com/practice/4e05294fc5aa4d4fa8eacef2e606e5a8?tpId=101&tqId=33080&tPage=1&rp=1&ru=/ta/programmer-code-interview-guide&qru=/ta/programmer-code-interview-guide/question-ranking

 

思路:

直接暴力去除會有問題,比如(2,3,5),目標爲11,這時直接除是不行的,所以這題得用動態規劃

時間複雜度N*aim,空間複雜度可以是N*aim,下面代碼做了空間壓縮,空間複雜度aim

#include <iostream>
#include <vector>
#include <limits.h>
using namespace std;

int getMin(int n,vector<int> &nums,int aim){
    if(aim == 0) return 0;
    if(n == 0) return -1;
    vector<int> dp(aim+1,INT_MAX);
    dp[0] = 0;
    for(int i = 0;i < n;i++){
        for(int j = nums[i];j <= aim;j++){
            if( dp[j-nums[i]] < INT_MAX)
                dp[j] = min(dp[j],dp[j-nums[i]]+1);
        }
    }
    return dp[aim]== INT_MAX? -1:dp[aim];
}

int main(){
    int n,aim;
    cin >> n >> aim;
    vector<int> nums(n);
    for(int i = 0;i < n;i++) cin >> nums[i];
    int res = getMin(n,nums,aim);
    cout << res << endl;
}

 

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