当前位置: 首页 > 知识库问答 >
问题:

硬币兑换:找到许多方法来复制给定的金额

甘君之
2023-03-14

给定一个值N,如果我们想换N美分,并且我们有无限量的S={S1,S2,…,Sm}值的硬币,我们可以用多少种方式来换?硬币的顺序无关紧要。例如,对于N=4和S={1,2,3},有四种解决方案:{1,1,1},{1,1,2},{2,2},{1,3}。所以输出应该是4。对于N=10和S={2,5,3,6},有五个解:{2,2,2,2,2},{2,2,3,3},{2,2,6},{2,3,5}和{5,5}。所以输出应该是5。

问题的联系是:https://www.geeksforgeeks.org/coin-change-dp-7/

我确实遇到了所有的解决方案。

我已经使用矩阵方法来解决这个问题:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>
#include <climits>
#include <map>
#include <set>
#include <queue>
#include <unordered_map>
#define ll long long
//Author: Nilargha Roy (neel13)
using namespace std;
int coinchangeways(int arr[],int n,int sum)
{

        int dp[n+1][sum+1];
        memset(dp,-1,sizeof(dp));


        for(int j=1;j<n;j++)
        {
            dp[0][j]=0;
        }
        for(int i=0;i<n;i++)
        {
            dp[i][0]=1;
        }



    for(int i=1;i<n+1;i++)
    {
        for(int j=1;j<sum+1;j++)
        {

            if(arr[i-1] <= j)
                dp[i][j]=dp[i][j-arr[i-1]] + dp[i-1][j];
            else
                dp[i][j]=dp[i-1][j];

        }
    }

    return dp[n][sum];

}

int main() 
{

    ios_base::sync_with_stdio(false);
    cin.tie(0);

#ifdef __APPLE__
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
#endif
    int n;
    cin>>n;
    int arr[n];
    for(int i=0;i<n;i++)
        cin>>arr[i];
    int sum; cin>>sum;
    cout<<coinchangeways(arr,n,sum);
}

然而,当我把数组={1,2,3}和SUM=5作为输入时,当我得到1时,输出应该是:5。有人能指出我代码中的逻辑错误吗?

共有2个答案

邵星河
2023-03-14

在所有for循环之后运行函数时。您将获得如下所示的DP。

 1   0   0  -1  -1  -1

 1   1   1   0  -1  -2

 1   1   2   1   1  -1

 -1  1   2   0   2   1

DP[3][5]=1,这就是为什么你得到1。

景明诚
2023-03-14

使用1d数组的版本:

int coinchangeways(int arr[], int n, int sum)
{
    int dp[sum+1];
    memset(dp, 0, sizeof(dp));
    dp[0] = 1;

    for (int i = 0; i < n; i++)
    {
        for (int j = arr[i]; j <= sum; j++)
        {
                dp[j] += dp[j - arr[i]];
        }
    }

    return dp[sum];
}
 类似资料:
  • 我在理解动态规划中的硬币兑换问题时遇到了一个小问题。简单地说,我必须用最少数量的硬币来兑换一笔钱。 我有n种面值为1=v1的硬币

  • 如果每枚硬币的数量是无限的,那么复杂性是O(n*m),其中是总变化,是硬币类型的数量。现在,当每种类型的硬币都受到限制时,我们必须考虑剩余的硬币。我设法使它与的复杂性使用另一个大小的,所以我可以跟踪每个类型的剩余硬币。有没有一种方法可以让复杂性变得更好?编辑:问题是计算进行精确给定更改所需的最少硬币数量以及我们使用每种硬币类型的次数

  • 我试图用记忆和递归来解决硬币兑换的问题。但是我的代码中有一些小故障,它给了我错误的输出。 硬币面额1,2 我要一笔4英镑的总数。 可能的方法是 (1,1,1,1) (1,2,1) (2,2) 我期望输出3,但它返回5

  • 我试图自己解决LeetCode问题322。硬币兑换: 您将获得一个整数数组,表示不同面额的硬币,以及一个整数金额,表示总金额。 返回您需要的最少数量的硬币,以弥补该金额。如果这些硬币的任何组合都无法弥补这一数额,则返回-1。 你可以假设每种硬币的数量是无限的。 我似乎有一个错误,无法找出它。 我用DFS解决,基本上是说当目标达到0时,只需将所有的聚集在一个数组中,并动态地保持尽可能短的结果。这是问

  • 在硬币系统C={c1,c2,…ck}中,应改变给定的数量x,以使每个硬币ci具有给定的重量wi。我们想计算可能变化的总重量。两种变化是不同的,如果他们包含在不同的顺序相同的硬币。 如何给出上述问题的动态规划递归?我知道最小硬币兑换问题的递归(即C(x)=min{C(x-C)1 for x

  • 我编写的代码使用动态规划解决了基本的硬币兑换问题,并给出了进行兑换所需的最小硬币数量。但是我想把每个硬币的数量存储在最小的数字里。 我试图做的是初始化数组,就像散列一样,只要找到,它就会增加的数量,即。但这并不是我想要的方式,因为它每次发现对应于时都会添加硬币。因此,在最终答案中,数字不是硬币的最终计数。 代码如下: