Java递归硬币更改尝试

时间:2013-05-10 19:35:50

标签: java algorithm coin-change

我正在尝试使用java硬币更改问题来枚举为n提供的所有可能的更改集。

我的逻辑如下:

while n >= denom m {
array[]+= denom m
n-= denom m
}
list.add[array[]]

return coinChanger(++denom)

我的代码:

public List<Integer> makeChange(int change) {

    int[] denominations;
    denominations = new int[]{1, 5, 10, 25};

    return changeMaker(change, denominations, 0);
}

public List<Integer> changeMaker(int change, int[] denominations, int index) {
    List<Integer> resultsList = new ArrayList<Integer>();
    int[] resultDenom;
    resultDenom = new int[4];

    if (change <= 1) {
        return resultsList;
    }

    while (change >= denominations[index]) {
        resultDenom[index] += denominations[index];
        System.out.println("ResultsDenom: " + resultDenom[index]);
        change -= denominations[index];
    }
    resultsList.add(resultDenom[index]);

    for (int val : resultDenom) {
        System.out.println(val);
    }


    if (change > denominations[index]) {    
        return changeMaker(change-=denominations[index], denominations, ++index);       

    }
    return resultsList;
}

这只输出一组所有枚举:

输出:

27
0
0
0
RESULT CHANGE PERMUTATIONS LIST: [27]

问题:

我很难弄清楚一旦其中一个完成后如何移动到下一个面额......我知道你应该转移到面额数组中的下一个指数......但是那只会添加下一个硬币...如何让它添加下一个最大的硬币,然后递归下降到下一个硬币......一直到所有4个硬币?

谢谢!

*的 修改 **

public List<Integer> makeChange(int change) {

    int[] denominations;
    denominations = new int[]{25, 10, 5, 1};

    return changeMaker(change, denominations, 0);
}

public List<Integer> changeMaker(int change, int[] denominations, int index) {
    List<Integer> resultsList = new ArrayList<Integer>();
    int[] resultDenom;
    resultDenom = new int[4];

    if (change <= 1) {
        return resultsList;
    }

    if (index > 3) { 
        return resultsList;
    }
    //if 27 >= 25
    if (change >= denominations[index]) {   

        //[+25, 0, 0, 0]
        resultDenom[index] += denominations[index];

        //{  LIST  } <--- [25, 0, 0, 0]
                //List now contains { [25, 0, 0, 0], }, still need all other permutations
        resultsList.add(resultDenom[index]);

        //27 - 25, 
        return changeMaker(change-=denominations[index], denominations, ++index);       

    }
    return resultsList;
}

渴望输出:列表清单...... 27美分:

LIST{ [1, 0, 0, 2], [0, 2, 1, 2], [0, 1, 3, 2]... etc}

2 个答案:

答案 0 :(得分:5)

最简单的解决方案是在每个步骤中递归到两个变体(如果你还没完成):

  1. 继续使用当前硬币:将其添加到列表并递归。
  2. 切换到下一个硬币:增加硬币位置并递归。
  3. 应该是这样的:

    public class Coins {
      static final int[] DENOMINATIONS = {25, 10, 5, 1};
    
      public static void change(int amount) {
        change(amount, new ArrayList<Integer>(), 0);
      }
    
      private static void change(int remaining, List<Integer> coins, int pos) {
        if (remaining == 0) {
          System.out.println(coins);
        } else {
          if (remaining >= DENOMINATIONS[pos]) {
            coins.add(DENOMINATIONS[pos]);
            change(remaining - DENOMINATIONS[pos], coins, pos);
            coins.remove(coins.size() - 1);
          }
          if (pos + 1 < DENOMINATIONS.length) {
            change(remaining, coins, pos + 1);
          }
        }
      }
    }
    

    如果您想收集列表,您需要复制添加硬币的列表(而不是在通话后退出)。

答案 1 :(得分:-1)

对于您要解决的问题,您的代码似乎有点费解

尝试实现此伪代码

  getChange(int totalCents)
  {
      if (totalCents > 25)
      {
         print "25";
         getChange(totalCents - 25);
      } 
      else (totalCents > 10)
      {
         // same for 10
      }
      else (totalCents > 5)
      {
         // same for 5
      }
      else
      {
         // print out number left as pennies
      }
  }

您可以使用数组索引和for循环轻松替换带有硬编码值的if语句,然后使用希望记录值进行打印。我希望有所帮助。