首页 > 试题广场 >

兑换零钱(一)

[编程题]兑换零钱(一)
  • 热度指数:88383 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的最少货币数。
如果无解,请返回-1.

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

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

示例1

输入

[5,2,3],20

输出

4
示例2

输入

[5,2,3],0

输出

0
示例3

输入

[3,5],2

输出

-1

备注:
0 \leq n \leq 10\,000
脑筋急转弯,根本不考编程。
int minMoney(int* arr, int arrLen, int aim ) {
    int dp[5001], i, j, res;
    if(arrLen==0)
        return -1;
    if(aim==0)
        return 0;
    for(i=0; i<aim; i++) 
        dp[i] = aim+1;
    for(i=0; i<arrLen; i++) 
        dp[arr[i]-1] = 1;
    for(i=0; i<aim; i++) 
        for(j=0; j<arrLen; j++) 
            if(i>=arr[j]) 
                dp[i] = min(dp[i], dp[i-arr[j]]+1);
    return (dp[aim-1]<=aim ? dp[aim-1] : -1);
}

编辑于 2024-03-25 20:46:03 回复(0)
参考大佬的代码,写一下自己的理解,可能会有帮助:
//dp[i-arr[j]]+1表示:dp[i]扣除遇到的这张单元面值arr[j]之后,剩下的钱数最少能用dp[i-arr[j]]来表示。+1即代表加上当前遇到的单元面值。
/*比如,货币的单元面值[2,3,5];
dp[0]=0;
dp[1]=max;
dp[2]=1;
dp[3]=1;
dp[4]=2;
dp[5]=2;
求dp[6],首先dp[6-arr[0]]==dp[6-2]==dp[4]==2,表示6元如果扣除2元后剩下的4元面值是可以用最少2张货币来表示的,而除去这两张之外,还要算上2元这一张面值才构成了整个6元。此时一共3张,小于max,因此dp[6]更新为3;
下一轮循环,dp[6-arr[1]]==dp[6-3]==dp[3]==1,表示6元扣除3元后剩下的3元可以从之前的结果中查到最少需要一张货币,1张+1,一共2张,小于当前存储的3张,因此dp[6]更新为2;
下一轮循环,dp[6-arr[2]]==dp[6-5]==dp[1]==max>2,说明无法更新,最小值仍是2,此时循环结束,跳出内层循环,求得dp[6]==2.
*/


发表于 2024-03-23 23:32:55 回复(0)
int min(int a, int b)
{
    return a>=b?b:a;
}
int minMoney(int* arr, int arrLen, int aim ) {
    if(aim < 1 )
    {
        return 0;
    }
    if(arrLen == 0 || arr == NULL)
    {
        return -1;
    }
   int dp[aim+1];//注意大于255就不能用memset
   for(int i =0 ;i < aim+1; i++)
   {
    dp[i] = aim+1;
   }
   dp[0] = 0;

   for(int i = 1; i<=aim;i++)
   {
    for(int j = 0; j < arrLen; j++)
    {
        if(arr[j] <=i)
        {
            dp[i] = min(dp[i], dp[i-arr[j]]+1);
        }
    }
   }
    if(dp[aim] > aim)
    {
        return -1;
    }
    return dp[aim];
}
发表于 2023-03-19 12:11:10 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 最少货币数
 * @param arr int整型一维数组 the array
 * @param arrLen int arr数组长度
 * @param aim int整型 the target
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int min(int a, int b){
    if(a>b)return b;
    else 
        return a;
}
int minMoney(int* arr, int arrLen, int aim ) {
    // write code here
    int dp[aim+1];
    dp[0]=0;
    for(int i=1; i<aim+1; i++){
        dp[i]=aim+1;
    }
    for(int i=1; i<aim+1; i++){
        for(int j=0; j<arrLen; j++){
            if(arr[j]<=i){
                dp[i]=min(dp[i],dp[i-arr[j]]+1);
            }
        }
    }
    if(dp[aim]>aim)
        return -1;
    else
        return dp[aim];
}
发表于 2022-07-29 21:21:09 回复(0)
/**
 * 最少货币数
 * @param arr int整型一维数组 the array
 * @param arrLen int arr数组长度
 * @param aim int整型 the target
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */

//这个代码17/22有五组随机测试过不了,有无大佬帮看一下哪里错了

int BubbleSort(int arrLen,int *dp,int target,int *arr){
    int res[100]={0},index=0;
    for(int i=0;i<arrLen;i++){
        if(target-arr[i]>=GetMinFaceValue(arr,arrLen)){  //比较的对象
            res[index++]=dp[target-arr[i]];
        }      
    }
    for(int i=0;i<index-1;i++){
        for(int j=0;j<index-i-1;j++){
            if(res[j]>res[j+1]){
                int temp=res[j];
                res[j]=res[j+1];
                res[j+1]=temp;
            }
        }
    }
    return res[0];
}

int GetMinFaceValue(int *arr,int arrLen){
    int min=arr[0];
    for(int i=1;i<arrLen;i++){
        if(arr[i]<min){
            min=arr[i];
        }
    
    return min;
}

int minMoney(int* arr, int arrLen, int aim ) {
    if(arrLen==0){
        return -1;
    }
    if(aim==0){
        return 0;
    }
    else if(aim>0&&aim<GetMinFaceValue(arr,arrLen)){
        return -1;
    }
    else{
        int dp[10000]={0},count=0;
        dp[0]=0;
        for(int i=0;i<arrLen;i++){
            dp[arr[i]]=1;
        
        for(int i=GetMinFaceValue(arr,arrLen);i<=aim;i++){
            if(dp[i]){
                continue;
            }
            else{
                dp[i]=BubbleSort(arrLen,dp,i,arr)+1;
            }
        }
        return dp[aim];
    }
}
发表于 2022-02-01 20:03:18 回复(0)