protected void SumCardSequence(CardSumSequence currentSequence, int currentIndex, int maxNumCards, float targetValue)
    {
        CardSumSequence cardSumSequence;

        if (currentSequence.Size () > maxNumCards) {
            return;
        } else if (currentSequence.Sum() >= targetValue) {
            cardSumSequenceList.Add (currentSequence);
        } else {
            for (int i = currentIndex + 1; i < playerHand.CardList ().Count; i++) {
                if (!lockedCardExists || lockedCard != playerHand.CardAtIndex (i)) {
                    cardSumSequence = new CardSumSequence(cardGame);
                    foreach(Card card in currentSequence.List ()) {
                        cardSumSequence.AddCard (card);
                    }

                    cardSumSequence.AddCard (playerHand.CardAtIndex(i));
                    SumCardSequence (cardSumSequence, i, maxNumCards, targetValue);
                }
            }
        }
    }
    protected List<Card> FindCardsToReachTargetValue(int maxNumCards, float targetValue)
    {
        CardSumSequence cardSumSequence;

        cardSumSequenceList.Clear ();
        for (int i = 0; i < playerHand.CardList ().Count; i++) {
            if (!lockedCardExists || lockedCard != playerHand.CardAtIndex (i)) {
                cardSumSequence = new CardSumSequence (cardGame);
                cardSumSequence.AddCard (playerHand.CardAtIndex (i));
                SumCardSequence (cardSumSequence, i, maxNumCards, targetValue);
            }
        }

        return SelectCardSequenceFromList();
    }