换钱的最少货币数/零钱兑换

题目:给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。如果无解,请返回-1。【要求】时间复杂度O(n×aim),空间复杂度On。

思路:

代码:

 1 /**
 2  * 最少货币数
 3  * @param arr int整型一维数组 the array
 4  * @param aim int整型 the target
 5  * @return int整型
 6  */
 7 function minMoney( arr ,  aim ) {
 8     // write code here
 9     arr.sort((a,b) => (a-b));
10     let dp = new Array(aim + 1);
11     dp[0] = 0;
12     for(let i = 1; i<= aim;i++){
13         let min_coins = Infinity;
14         for(let j = 0; j < arr.length; j++){
15             if(i - arr[j] >= 0){
16                 let num_coins = dp[i-arr[j]] + 1;
17                 if(num_coins < min_coins){
18                     min_coins = num_coins;
19                 }
20             }
21         }
22         dp[i] = min_coins;
23     }
24    if(dp[aim] === Infinity){
25        return -1;
26    } 
27     return dp[aim];
28 }
29 module.exports = {
30     minMoney : minMoney
31 };

 

posted @ 2021-05-24 11:41  icyyyy  阅读(90)  评论(0)    收藏  举报