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

动态规划的硬币更换问题

贾飞章
2023-03-14

这是我关于硬币更换问题的代码,用于打印一组硬币的总方式数和目标金额

def coin_change(coins,amount):
    table=[0 for k in range(amount+1)]
    table[0]=1
    for coin in coins:
        for x in range(coin,amount+1):
            table[x] = table[x]+ table[x-coin]
        print(table)  

    return table[amount]

我想知道是否有任何方法可以用相同的动态规划解决方案打印这些方法(借助内部构造的表或任何其他方法)

例如,如果一组硬币是[1,3,5],目标金额是6,那么总共有4种可能的方式。[1,1,1,1,1,1,1,],[1,1,1,3],[3,3],[1,5]]我希望这种方式的列表作为输出。

共有3个答案

姬振濂
2023-03-14
    Arrays.sort(coins);
    int dp[]=new int [amount+1];
    Arrays.fill(dp,amount+1);
    dp[0]=0;
    for(int i=0;i<=amount;i++){
        for(int j=0;j<coins.length;j++){
            
            if(coins[j]<=i){
                
                dp[i]=Math.min(dp[i], 1+dp[i-coins[j]]);
                
            }
            else
                break;
            
        }
        
        
    }
   
    return dp[amount]>amount ? -1: dp[amount];
许博达
2023-03-14

您可以随时调整当前代码以生成解决方案列表。

def coin_change(coins,amount):
    table=[[] for k in range(amount+1)]
    table[0].append([]) # or table[0] = [[]], if you prefer
    for coin in coins:
        for x in range(coin,amount+1):
            table[x].extend(solution + [coin] for solution in table[x-coin])
        print(table)  

    return table[amount]

变量现在是列表列表列表,内部列表是加起来等于给定值的硬币组合,而不仅仅是这些组合中有多少的计数。我使用传递给extend的生成器表达式,而不是添加新的组合。

南宫海超
2023-03-14

根据您的要求编辑答案:

def combine(parent, me):
    if len(parent) == 0:
        return [[me]]
    new_list = []
    for entry in parent:
        new_list.append(entry + [me])
    return new_list


def get_ways(amount, coins):
    table = [0 for k in range(amount + 1)]
    table[0] = 1
    ways = [[] for _ in range(amount + 1)]
    for coin in coins:
        for x in range(coin, amount + 1):
            table[x] = table[x] + table[x - coin]
            ways[x].extend(combine(ways[x - coin], coin))
    print(ways[amount])
    return table[amount]


print(get_ways(6, [1, 3, 5]))

输出:

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

  • 但是我们不能这样做吗:(是给定的可用硬币的排序集,和是它的下标,是给定的最高价值硬币) 我写的东西有什么问题吗?虽然解决方案不是动态的,但不是更有效吗?

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

  • 我在理解各种问题的动态规划解决方案方面存在问题,特别是硬币兑换问题: “给定一个值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,

  • 问题-你会得到不同面额的硬币和总金额。写一个函数来计算你需要的最少数量的硬币来组成这个数量。那里有无限的硬币供应。 我的方法——我遵循了自上而下的方法,但是使用map stl进行记忆,我得到了TLE。请帮助找出误差和估计时间复杂度。 这是我的密码-

  • 我一直在使用动态规划研究硬币兑换问题。我尝试制作一个数组fin[],其中包含索引所需的最小硬币数,然后打印它。我已经写了一个代码,我认为应该给出正确的输出,但我不明白为什么它没有给出准确的答案。例如:对于输入:4 3 1 2 3(4是要更改的金额,3是可用硬币的类型,1 2 3是硬币值列表)输出应该是:0 1 1 2(因为我们有1,2,3作为可用硬币,需要0个硬币更改0,1个硬币更改1,1个硬币更