Наличие "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);
}
}
}