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

动态换币算法(最优结果)

陈欣荣
2023-03-14

我已经得到了动态编程的这部分代码(找到硬币变化的最佳组合。例如,如果我们有两个价值3和4的硬币-

Total coins:3 , #of Coins with value "3" = 1, #of Coins with value "4" = 2

给定金额的总硬币数量可以从该数组的最小值[总和]中找到。但我试图获取的其他信息(哪枚硬币价值多少)似乎几乎不可能找到。此外,从阵列硬币[sum][0]中,我只能找到最后一枚使用的硬币,在本例中是3。

Inputs: sum=11 ,int[] valueCoins = new int[]{3,4}; 
Output:
1 10011 0(0)
2 10011 0(0)
3 1 3(0)
4 1 4(0)
5 10011 0(0)
6 2 3(3)
7 2 3(4)
8 2 4(4)
9 3 3(6)
10 3 3(7)
11 3 3(8)

如您所见,它会检查从1到11的所有内容,但当它达到11时,它会存储正确数量的硬币(3)和最后使用的硬币(3)。

public class MinimumCoin {

    public static void main(String args[]){

        int[] valueCoins = new int[]{3,4};
        int sum = 11;
        int[] minimum = new int[sum+1];
        int[][] coins = new int[sum+1][2];

        /* initializing the minimum of every sum to infinity */
        for(int i = 1; i < minimum.length; i++){
            minimum[i] = sum + 10000;
        }
        /* initializing that for minumum sum of zero, 0 coin is required */
        minimum[0] = 0;

        for(int i = 1; i <= sum; i++){
            for(int j = 0; j <valueCoins.length; j++){
                if(valueCoins[j] == i){
                    minimum[i] = 1;
                    coins[i][0] = i;
                    coins[i][1] = 0;
                }
                else if((valueCoins[j] < i) && (((minimum[i-valueCoins[j]]) + 1) < minimum[i])){

                    minimum[i] = (minimum[i-valueCoins[j]]) + 1;
                    coins[i][0] = valueCoins[j];
                    coins[i][1] = (i-valueCoins[j]);
                }
            }
        }

        for(int k = 1; k < minimum.length; k++){
            System.out.println( k + " " + minimum[k] + " " + coins[k][0] +"("+ coins[k][1] +")");
        }
    }
}

感谢任何输入!

~问候,S

共有1个答案

宗政功
2023-03-14

问题是硬币中的值是硬币的值,而不是计数<代码>硬币

0 0 0 3 0 0 3 3 4 3 3 3 
0 0 0 0 4 0 3 4 4 6 7 8

因此,您需要重建计数:

for(int k = 1; k < minimum.length; k++)
{
   int count1 = 0, count2 = 0, pos = k;
   if (coins[pos][1] > 0)
      while (true)
      {
         if (coins[pos][0] == 3) count1++;
         if (coins[pos][0] == 4) count2++;
         if (coins[pos][1] == 3) count1++;
         if (coins[pos][1] == 4) count2++;
         if (coins[pos][1] < 5) // stop when 0/3/4
            break;
         pos = coins[pos][1];
      }
   System.out.println(k + " " + minimum[k] + " " +
                      count1 + " of coin 3, " + count2 + " of coin 4");
}

这些也是解决问题的选项:

>

  • 每个硬币出现的次数都有行。如果你有2个硬币,每个可以出现5次,你将有5x2=10行。

    有如下行:

    • 第1行=硬币1
    • 第2行=硬币2的1
    • 第3行=硬币1的2
    • 第4行=硬币2的2
    • 第5行=硬币1的4
    • 第6行=硬币2的4
    • 第7行=硬币1的8
    • 第8行=硬币2的8
    • ...

    后者显然更复杂,但更受欢迎,因为更多的硬币将有更少的行。

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

    • 我被硬币面额问题难住了。 我正试图找到最低数量的硬币用来弥补5.70美元(或570美分)。例如,如果硬币数组是{100,5,2,5,1}(100 x 10c硬币,5 x 20c,2 x 50c,5 x$1和1 x$2硬币),那么结果应该是{0,1,1,3,1},此时硬币数组将由相同面额($2,1,50c,20c,10c)组成 我被困在如何从硬币数组中扣除值并返回它。 编辑:新代码

    •   梯度下降(GD)是最小化风险函数、损失函数的一种常用方法,随机梯度下降和批量梯度下降是两种迭代求解思路。 1 批量梯度下降算法   假设h(theta)是要拟合的函数,J(theta)是损失函数,这里theta是要迭代求解的值。这两个函数的公式如下,其中m是训练集的记录条数,j是参数的个数:   梯度下降法目的就是求出使损失函数最小时的theta。批量梯度下降的求解思路如下: 对损失函数求th

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

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

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