Наличие "AWT-EventQueue-0" java.lang.StackruError с определенным набором переменных

Я кодирую эту программу для решения следующего уравнения: ax + b y + cz +.... + n k<= d a, b, c,..., n и d будут введены пользователем.

Представляя, что a, b, c,..., n - это прайс-лист, а x y z... k - это количество. Чтобы дать вам денежную сумму d, вам нужно оптимизировать хорошее количество, которое вы можете купить, пока вы не сможете купить что-нибудь еще со своим остатком.

Моя программа работает нормально с небольшим количеством хорошего (5). Если я введу следующие значения: - Количество товаров: 6 - Прайс-лист: - Позиция 1: 600 - Позиция 2: 900 - Позиция 3: 1200 - Позиция 4: 1600 - Позиция 5: 1800 - Позиция 6: 2400 - Итого: 6000

, это вызовет "AWT-EventQueue-0" java.lang.StackruError.

Можете ли вы помочь проверить и предложить, где я могу улучшить его?

    btnNhpLngHng.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            isValid = true;
            isValid = validateField();
            if (!isValid)
                JOptionPane.showMessageDialog(null, "Please input valid data");
            else
                goodQuantity = Integer.parseInt(goodQuantityTF.getText());
                headerList = new Vector<String>(goodQuantity);
                priceList = new Vector<Long>(goodQuantity);
                quantityList = new Vector<Long>(goodQuantity);
                isChecked = new Vector<Boolean>(goodQuantity);
                for (int i = 1; i <= goodQuantity; i++) {
                    headerList.add("Mặt hàng " + i);
                    isChecked.add(false);
                    quantityList.add((long) 0);
                }

                for (int i = 0; i < goodQuantity; i++) {
                    vitrihang = i;
                    gianhap = Long.parseLong(JOptionPane.showInputDialog("Please input the price for good no." + (vitrihang+1)));
                    priceList.add(gianhap);
                }
                expectedSum = Long.parseLong(JOptionPane.showInputDialog("Please input expected total amount: "));

        }
    });

    btnKimTra.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            for (int x1 = goodQuantity - 1; x1 > -1; x1--) {
                inProcess = x1;
                isDone = false;
                timNghiem(x1);

            }
        }
    });
}

public boolean validateField() {
    if (goodQuantityTF.getText() == null)
        return false;
    else
        try {
            Double n = Double.parseDouble(goodQuantityTF.getText());
        }
        catch(Exception e) {
            return false;
        }

    return true;
}

public void timNghiem(int a) {
    //System.out.println(a);
    if ((a+1) == goodQuantity) {
        kiemNghiem();
        isChecked.set(a, true);
        if ((inProcess + 1) == goodQuantity) {
            return;

        } else {
            timNghiem(a-1);
            if (isChecked.get(inProcess)) {
                isDone = true;
                return;
            }
        }
    } else {
        if (!isChecked.get(a)) {
            if (quantityList.get(a) <= (expectedSum/priceList.get(a))) {
                tangNghiem(a);
                kiemNghiem();
                resetIsChecked(a);
                timNghiem(a+1);
                if (isChecked.get(inProcess)) {
                    isDone = true;
                    return;
                }
            } else {
                isChecked.set(a, true);
                if (isChecked.get(inProcess)) {
                    isDone = true;
                    return;
                } else {
                    for (int x2 = inProcess; x2 < goodQuantity; x2++) {
                        if (!isChecked.get(x2)) {
                            if (isChecked.get(x2+1)) {
                                timNghiem(x2);
                            }
                        }
                    }
                }
            }
        }
    }

}

public void kiemNghiem() {
    quantityList.set(goodQuantity-1, (long) 0);
    do {
        currentSum = 0;
        for (int n = 0; n < goodQuantity; n++) {
            currentSum = currentSum + priceList.get(n)*quantityList.get(n);
            //System.out.println(priceList.get(n)*quantityList.get(n));
        }

        if (currentSum <= expectedSum) {
            leftOver = expectedSum - currentSum;
            isResult = true;

            for (int n = 0; n< goodQuantity; n++) {
                if (leftOver > priceList.get(n)) {
                    isResult = false;
                }
            }

            if (isResult) {
                result = "";
                for (int n = 0; n < goodQuantity; n++){
                    result = result + quantityList.get(n) + " ";
                }
                System.out.println(result);
            }
        }
        quantityList.set(goodQuantity-1, quantityList.get(goodQuantity-1)+1);
    }
    while (currentSum <= expectedSum);

}

public void tangNghiem(int a) {
    quantityList.set(a, quantityList.get(a)+1);
    for (int k = a + 1; k < goodQuantity; k++) {
        quantityList.set(k, (long) 0);
    }
}

public void resetIsChecked(int a) {
    for (int k = a + 1; k < goodQuantity; k++) {
        isChecked.set(k, false);
    }
}

}

0 ответов

Другие вопросы по тегам