private static ChangeOptionList SetUpInitialPossibleChangeOptions() { var changeObjectList = new ChangeOptionList(); changeObjectList.AddChangeOption(0); return(changeObjectList); }
private static void ConsiderPossibleChangeOptionsForCoin(int target, ChangeOptionList possibleChangeOptions, int coin) { for (int subTarget = coin; subTarget <= target; ++subTarget) { var changeOption = GetPossibleChangeOptionWhenCoinSubtractedFromSubTarget(possibleChangeOptions, coin, subTarget); if (ExistingChangeOptionShouldBeUpdated(possibleChangeOptions, subTarget, changeOption)) { UpdateChangeOption(possibleChangeOptions, subTarget, coin, changeOption); } } }
private static void UpdateChangeOption(ChangeOptionList possibleChangeOptions, int targetValue, int coin, ChangeOption existingChangeOption) { var newCoinList = CreateNewCoinList(coin, existingChangeOption); if (!possibleChangeOptions.ChangeOptionExistsForTargetValue(targetValue)) { possibleChangeOptions.AddChangeOption(targetValue, newCoinList); } else { possibleChangeOptions.GetChangeOption(targetValue).SetChangeCoins(newCoinList); } }
private static ChangeOption GetPossibleChangeOptionWhenCoinSubtractedFromSubTarget(ChangeOptionList possibleChangeOptions, int coin, int subtarget) { int targetAfterCoinStubtracted = subtarget - coin; return(possibleChangeOptions.GetChangeOption(targetAfterCoinStubtracted)); }
private static bool ExactChangeCanBeGiven(ChangeOptionList possibleChangeOptions, int target) { return(possibleChangeOptions.ChangeOptionExistsForTargetValue(target)); }
private static bool ExistingChangeOptionShouldBeUpdated(ChangeOptionList existingChangeOptions, int subtarget, ChangeOption newChangeOption) { return(newChangeOption != null && (!existingChangeOptions.ChangeOptionExistsForTargetValue(subtarget) || NewChangeOptionIsShorter(existingChangeOptions.GetChangeOption(subtarget), newChangeOption))); }