换钱的最少货币数

题目一:给定数组arr,arr中所有的值都为正数。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数。

如 arr=[5,2,3], aim=20. 最少需要4张

解题思路:
经典动态规划一般分为3部,先求dp[i][j]矩阵中第一列的值,然后求dp矩阵中第一行的值,最后再依次从左到右,从上到下求剩下的位置。这里写图片描述

C++ 代码如下所示

#include  <stdio.h>
#include <iostream>
#define MAX 999
using namespace std;

int min1(int left, int up)
{
return left > up ? up : left;
}

int minCoins(int arr[], const int aim)
{
    if((arr[0] == '\0') || (aim < 0))
        return -1;
const int   row=3;
const int col = aim;

int dp[row][20+1];
for (int i = 0; i < row; i++)
    dp[i][0] = 0;
for (int j = 1; j <= col; j++ )
{
   dp[0][j] = MAX;
   if ((j-arr[0]) >= 0  && dp[0][j-arr[0]] != MAX)
         dp[0][j] = dp[0][j-arr[0]] +1;
   cout<<dp[0][j]<<endl;
}

int left = 0;
for (int i = 1; i <  row; i++)
    for(int j = 1; j <=  aim; j++)
    {
    left = MAX;
    if ( (j-arr[i] >=0) && dp[i][j-arr[i]] != MAX)
         left = dp[i][j-arr[i]] +1;
    dp[i][j] = min1(left, dp[i-1][j]);

    }
    return dp[row-1][aim];
}

int main()
{
    int arr[] = {5,2,3};
    int aim=20;
    int result;
    result = minCoins(arr, aim);
    printf("%d\n",result);
    //cout << result;
}

题目二:若每个值仅代表一张钱的面值,给定一个整数aim代表要找的钱数,求组成aim的最少货币数。
举例: arr=[5,2,5,3], aim =15 所有钱加起来为15,所以返回4

解题思路:
这里写图片描述

C++ 代码如下所示

#include  <stdio.h>
#include <iostream>
#define MAX 999   

using namespace std;

int min1(int left, int up)
{
return left > up ? up : left;
}

int minCoins(int arr[], const int aim)
{
    if((arr[0] == '\0') || (aim < 0))
        return -1;

const int   row=3;
const int col = aim;

int dp[row][7+1];
for (int i = 0; i < row; i++)
    dp[i][0] = 0;
for (int j = 1; j <= col; j++ )
{
   dp[0][j] = MAX;

}
dp[0][arr[0]] = 1;

int left = 0;
for (int i = 1; i <  row; i++)
    for(int j = 1; j <=  aim; j++)
    {
    left = MAX;
    if ( (j-arr[i] >=0) && dp[i-1][j-arr[i]] != MAX)
         left = dp[i-1][j-arr[i]] +1;
    dp[i][j] = min1(left, dp[i-1][j]);

    }
    return dp[row-1][aim];
}

int main()
{
    int arr[] = {5,2,3};
    int aim=7;
    int result;
    result = minCoins(arr, aim);
    printf("%d\n",result);
    //cout << result;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值