Find the least number of coins required that can make any change from 1 to 99 cents

后端 未结 27 2163
生来不讨喜
生来不讨喜 2020-12-07 10:08

Recently I challenged my co-worker to write an algorithm to solve this problem:

Find the least number of coins required that can make any change from

27条回答
  •  [愿得一人]
    2020-12-07 10:26

    Nice Question. This is the logic I came up with. Tested with few scenarios including 25.

    class Program
    {
    
        //Allowable denominations
        const int penny = 1;
        const int nickel = 5;
        const int dime = 10;
        const int quarter = 25;
    
        const int maxCurrencyLevelForTest =55; //1-n where n<=99
    
        static void Main(string[] args)
        {         
            int minPenniesNeeded = 0;
            int minNickelsNeeded = 0; 
            int minDimesNeeded = 0; 
            int minQuartersNeeded = 0;
    
    
            if (maxCurrencyLevelForTest == penny)
            {
                minPenniesNeeded = 1;
            }
            else if (maxCurrencyLevelForTest < nickel)
            {
                minPenniesNeeded = MinCountNeeded(penny, maxCurrencyLevelForTest);                
            }
            else if (maxCurrencyLevelForTest < dime)
            {
                minPenniesNeeded = MinCountNeeded(penny, nickel - 1);
                minNickelsNeeded = MinCountNeeded(nickel, maxCurrencyLevelForTest);                
            }
            else if (maxCurrencyLevelForTest < quarter)
            {
                minPenniesNeeded = MinCountNeeded(penny, nickel - 1);
                minNickelsNeeded = MinCountNeeded(nickel, dime - 1);
                minDimesNeeded = MinCountNeeded(dime, maxCurrencyLevelForTest);
            }
            else
            {
                minPenniesNeeded = MinCountNeeded(penny, nickel - 1);
                minNickelsNeeded = MinCountNeeded(nickel, dime - 1);
                minDimesNeeded = MinCountNeeded(dime, quarter - 1);
    
                var maxPossilbleValueWithoutQuarters = (minPenniesNeeded * penny + minNickelsNeeded * nickel + minDimesNeeded * dime);
                if (maxCurrencyLevelForTest > maxPossilbleValueWithoutQuarters)
                {               
                    minQuartersNeeded = (((maxCurrencyLevelForTest - maxPossilbleValueWithoutQuarters)-1) / quarter) + 1;
                }
            }
    
    
            var minCoinsNeeded = minPenniesNeeded + minNickelsNeeded+minDimesNeeded+minQuartersNeeded;
    
            Console.WriteLine(String.Format("Min Number of coins needed: {0}", minCoinsNeeded));
            Console.WriteLine(String.Format("Penny: {0} needed", minPenniesNeeded));
            Console.WriteLine(String.Format("Nickels: {0} needed", minNickelsNeeded));
            Console.WriteLine(String.Format("Dimes: {0} needed", minDimesNeeded));
            Console.WriteLine(String.Format("Quarters: {0} needed", minQuartersNeeded));
            Console.ReadLine();
        }
    
        private static int MinCountNeeded(int denomination, int upperRange)
        {
            int remainder;
            return System.Math.DivRem(upperRange, denomination,out remainder);
        }
    }
    

    Some results: When maxCurrencyLevelForTest = 25

    Min Number of coins needed: 7
    Penny: 4 needed
    Nickels: 1 needed
    Dimes: 2 needed
    Quarters: 0 needed
    

    When maxCurrencyLevelForTest = 99

    Min Number of coins needed: 10
    Penny: 4 needed
    Nickels: 1 needed
    Dimes: 2 needed
    Quarters: 3 needed
    

    maxCurrencyLevelForTest : 54

    Min Number of coins needed: 8
    Penny: 4 needed
    Nickels: 1 needed
    Dimes: 2 needed
    Quarters: 1 needed
    

    maxCurrencyLevelForTest : 55

    Min Number of coins needed: 9
    Penny: 4 needed
    Nickels: 1 needed
    Dimes: 2 needed
    Quarters: 2 needed
    

    maxCurrencyLevelForTest : 79

    Min Number of coins needed: 9
    Penny: 4 needed
    Nickels: 1 needed
    Dimes: 2 needed
    Quarters: 2 needed
    

    maxCurrencyLevelForTest : 85

    Min Number of coins needed: 10
    Penny: 4 needed
    Nickels: 1 needed
    Dimes: 2 needed
    Quarters: 3 needed
    

    The code can further be refactored I guess.

提交回复
热议问题