Problema na soma de subconjuntos

Estou tendo um problema com a contagem, que é a continuação deesta Pergunta, questão. Eu não sou realmente uma pessoa de matemática, então é realmente difícil para mim descobrir issosubset sum problem que foi sugerido como resolução.

Estou tendo 4ArrayList em que mantenho dados: alId, alTransaction, alNumber, alPrice

Tipo | Transação Número | Preço
8 Comprar | 95.00000000 | 305.00000000
8 Comprar | 126.00000000 | 305.00000000
8 Comprar | 93.00000000 | 306.00000000
8 Transferir para fora | 221.00000000 | 305.00000000
8 Transferência em | 221.00000000 | 305.00000000
8 Vender | 93.00000000 | 360.00000000
8 Vender | 95.00000000 | 360.00000000
8 Vender | 126.00000000 | 360.00000000
8 Comprar | 276.00000000 | 380.00000000

No final, estou tentando obter o que resta para o cliente e o que resta colocar em 3 listas de array:
- alNewHowMuch (corresponde a alNumber),
- alNewPrice (corresponde a alPrice),
- alNewInID (corresponde a alID)

        ArrayList alNewHowMuch = new ArrayList();
        ArrayList alNewPrice = new ArrayList();
        ArrayList alNewInID = new ArrayList();
        for (int i = 0; i < alTransaction.Count; i++) {
            string transaction = (string) alTransaction[i];
            string id = (string) alID[i];
            decimal price = (decimal) alPrice[i];
            decimal number = (decimal) alNumber[i];
            switch (transaction) {
                case "Transfer out":
                case "Sell":
                    int index = alNewHowMuch.IndexOf(number);
                    if (index != -1) {
                        alNewHowMuch.RemoveAt(index);
                        alNewPrice.RemoveAt(index);
                        alNewInID.RemoveAt(index);
                    } else {
                        ArrayList alTemp = new ArrayList();
                        decimal sum = 0;
                        for (int j = 0; j < alNewHowMuch.Count; j ++) {
                            string tempid = (string) alNewInID[j];
                            decimal tempPrice = (decimal) alNewPrice[j];
                            decimal tempNumbers = (decimal) alNewHowMuch[j];
                            if (id == tempid && tempPrice == price) {
                                alTemp.Add(j);
                                sum = sum + tempNumbers;
                            }
                        }
                        if (sum == number) {
                            for (int j = alTemp.Count - 1; j >= 0; j --) {
                                int tempIndex = (int) alTemp[j];
                                alNewHowMuch.RemoveAt(tempIndex);
                                alNewPrice.RemoveAt(tempIndex);
                                alNewInID.RemoveAt(tempIndex);
                            }
                        }
                    }
                    break;
                case "Transfer In":
                case "Buy":
                    alNewHowMuch.Add(number);
                    alNewPrice.Add(price);
                    alNewInID.Add(id);
                    break;
            }
        }

Basicamente, estou adicionando e removendo itens da matriz, dependendo do tipo de transação, ID da transação e números. Estou adicionando números ao ArrayList como 156, 340 (quando é TransferIn ou Buy) etc e depois os removo fazendo-o como 156, 340 (quando é TransferOut, Sell). Minha solução funciona para isso sem problemas. O problema que tenho é que, para alguns dados antigos, os funcionários estavam inserindo somas como 1500, em vez de 500 + 400 + 100 + 500. Como eu mudaria isso para que, quando houverSell/TransferOut ouBuy/Transfer In e não há correspondência dentro de ArrayList, ele deve tentar adicionar vários itens desseArrayList e encontre elementos que se combinem em agregados.

Dentro do meu código, tentei resolver esse problema com uma simples soma de tudo quando não havia correspondência (índice == 1)

                    int index = alNewHowMuch.IndexOf(number);
                    if (index != -1) {
                        alNewHowMuch.RemoveAt(index);
                        alNewPrice.RemoveAt(index);
                        alNewInID.RemoveAt(index);
                    } else {
                        ArrayList alTemp = new ArrayList();
                        decimal sum = 0;
                        for (int j = 0; j < alNewHowMuch.Count; j ++) {
                            string tempid = (string) alNewInID[j];
                            decimal tempPrice = (decimal) alNewPrice[j];
                            decimal tempNumbers = (decimal) alNewHowMuch[j];
                            if (id == tempid && tempPrice == price) {
                                alTemp.Add(j);
                                sum = sum + tempNumbers;
                            }
                        }
                        if (sum == number) {
                            for (int j = alTemp.Count - 1; j >= 0; j --) {
                                int tempIndex = (int) alTemp[j];
                                alNewHowMuch.RemoveAt(tempIndex);
                                alNewPrice.RemoveAt(tempIndex);
                                alNewInID.RemoveAt(tempIndex);
                            }
                        }
                    }

Mas só funciona se certas condições forem atendidas e falhar pelo resto.

Editar: Como alguns de vocês ficaram tão surpresos (e cegos) com meus nomes de variáveis poloneses, traduzi todos eles para o inglês por simplicidade e visibilidade. Espero que isso me ajude a obter ajuda :-)

questionAnswers(2)

yourAnswerToTheQuestion