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 :-)