Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态硬币更换算法(最佳结果)_Java_Algorithm_Data Structures_Dynamic Programming - Fatal编程技术网

Java 动态硬币更换算法(最佳结果)

Java 动态硬币更换算法(最佳结果),java,algorithm,data-structures,dynamic-programming,Java,Algorithm,Data Structures,Dynamic Programming,我已经得到了关于动态规划的这部分代码(它找到了硬币兑换的最佳组合。例如,如果我们有两枚价值为3和4的硬币-->{3,4};我们想要进行兑换的金额是例如sum=11,答案是我们总共需要3枚硬币(价值为4的2枚硬币和价值为3的1枚硬币)。下面的代码运行良好,但并不完全符合我的要求。我正在尝试对下面的代码进行反向工程,以便它能提供如下更清晰的答案: Total coins:3 , #of Coins with value "3" = 1, #of Coins with value "4" = 2 给

我已经得到了关于动态规划的这部分代码(它找到了硬币兑换的最佳组合。例如,如果我们有两枚价值为3和4的硬币-->{3,4};我们想要进行兑换的金额是例如sum=11,答案是我们总共需要3枚硬币(价值为4的2枚硬币和价值为3的1枚硬币)。下面的代码运行良好,但并不完全符合我的要求。

我正在尝试对下面的代码进行反向工程,以便它能提供如下更清晰的答案:

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)

公共类最小硬币{
公共静态void main(字符串参数[]){
int[]valueCoins=新的int[]{3,4};
整数和=11;
int[]最小值=新的int[sum+1];
整数[]硬币=新整数[总和+1][2];
/*将每个和的最小值初始化为无穷大*/
对于(int i=1;i对于(int i=1;i而言,问题在于
硬币中的值是硬币的值,而不是计数。
硬币

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");
}
for(int k=1;k0)
while(true)
{
如果(硬币[pos][0]==3)计数1++;
如果(硬币[pos][0]==4)计数2++;
如果(硬币[pos][1]==3)计数1++;
如果(硬币[pos][1]==4)计数2++;
如果(硬币[pos][1]<5)//在0/3/4时停止
打破
pos=硬币[pos][1];
}
System.out.println(k+“”+最小值[k]+“”+
硬币3的“count1+”,硬币4的“count2+”;
}
这些也是解决问题的选项:

  • 每出现一个硬币,就有一行。如果你有两个硬币,每个硬币可以出现5次,那么你就有5x2=10行

  • 有如下行:

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

后者更为复杂,但更为可取,因为更多的硬币将有更少的行。

问题在于
硬币中的值是硬币的值,而不是计数。
硬币

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");
}
for(int k=1;k0)
while(true)
{
如果(硬币[pos][0]==3)计数1++;
如果(硬币[pos][0]==4)计数2++;
如果(硬币[pos][1]==3)计数1++;
如果(硬币[pos][1]==4)计数2++;
如果(硬币[pos][1]<5)//在0/3/4时停止
打破
pos=硬币[pos][1];
}
System.out.println(k+“”+最小值[k]+“”+
硬币3的“count1+”,硬币4的“count2+”;
}
这些也是解决问题的选项:

  • 每出现一个硬币,就有一行。如果你有两个硬币,每个硬币可以出现5次,那么你就有5x2=10行

  • 有如下行:

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

后者更为复杂,但更为可取,因为更多的硬币将有更少的行。

这里的问题是什么?这里的问题是什么?