Как найти наиболее эффективное использование денежной суммы с использованием затрат на оборудование? - PullRequest
0 голосов
/ 18 октября 2019

Я работаю над проектом для школы уже пару часов и до сих пор не могу понять, что это правильно. Мне было поручено взять пользовательские данные для 3-х цен на оборудование, общего фонда и лимита остатка, а затем выяснить суммы 3-х оборудования, которое я могу купить, чтобы максимально приблизить общую стоимость к максимальному фонду, покаоставаясь внутри предела. Программа должна использовать какой-то вложенный цикл. Это то, что у меня в данный момент определенно не работает:

import java.text.DecimalFormat;
import java.util.Scanner;
public class GrandFund {

    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);
        DecimalFormat fmt =  new DecimalFormat("#.##");

        int amt1 = 0, amt2 = 0, amt3 = 0;
        double price1, price2, price3, fund, limit, total1 = 0, total2 = 0, total3 = 0;

        System.out.println("Equipment #1 Price:");
        price1 = scan.nextDouble();

        System.out.println("Equipment #2 Price:");
        price2 = scan.nextDouble();

        System.out.println("Equipment #3 Price:");
        price3 = scan.nextDouble();

        System.out.println("Total Fund Amount:");
        fund = scan.nextDouble();

        System.out.println("Remaining Fund Limit:");
        limit = scan.nextDouble();

        while((fund - (total1 + total2 + total3)) <= limit) {
            for(amt1 = 0; price1 * amt1 <= fund; amt1++) {
                total1 = price1 * amt1;
                for(amt2 = 0; price2 * amt2 <= fund - total1; amt2++) {
                    total2 = price2 * amt2;
                    for(amt3 = 0; price3 * amt3 <= fund - total1 - total2; amt3++) {
                        total3 = price3 * amt3;
                    }
                }
            }
        }
        double remainder = fund - (total1 + total2 + total3);
        System.out.println(fmt.format(remainder) + ", " + fmt.format(amt1) + ", " + fmt.format(amt2) + ", " + fmt.format(amt3));
        scan.close();
    }
}

Что-то мне не хватает? Я чувствую, что я определенно на правильном пути, но я не могу понять, где я ошибся. Любое руководство будет с благодарностью!

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Вам нужно выбрать лучший результат, когда вычисляете цикл. Основная логика:

if (total1 + total2 + total3 > fund) {
    break;
}
//here is the code to pick the current better result
if (total1 + total2 + total3 <= fund
        && total1 + total2 + total3 >= fund - limit) {
    double currentCost = total1 + total2 + total3;
    if (currentCost > maxCost) {
        maxCost = currentCost;
        amountOfMaxCostOptional = Optional.of(new Amount(amt1, amt2, amt3));
    }
}

Ниже приведен весь код:

import java.text.DecimalFormat;
import java.util.Optional;
import java.util.Scanner;

public class GrandFund {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        DecimalFormat fmt = new DecimalFormat("#.##");

        int amt1 = 0, amt2 = 0, amt3 = 0;
        double price1, price2, price3, fund, limit, total1 = 0, total2 = 0, total3 = 0;

        System.out.println("Equipment #1 Price:");
        price1 = scan.nextDouble();

        System.out.println("Equipment #2 Price:");
        price2 = scan.nextDouble();

        System.out.println("Equipment #3 Price:");
        price3 = scan.nextDouble();

        System.out.println("Total Fund Amount:");
        fund = scan.nextDouble();

        System.out.println("Remaining Fund Limit:");
        limit = scan.nextDouble();

        double maxCost = 0d;
        Optional<Amount> amountOfMaxCostOptional = Optional.empty();
        for (amt1 = 0; price1 * amt1 <= fund; amt1++) {
            total1 = price1 * amt1;

            for (amt2 = 0; price2 * amt2 <= fund - total1; amt2++) {
                total2 = price2 * amt2;

                for (amt3 = 0; price3 * amt3 <= fund - total1 - total2; amt3++) {
                    total3 = price3 * amt3;

                    if (total1 + total2 + total3 > fund) {
                        break;
                    }
                    //here is the code to pick the current better result
                    if (total1 + total2 + total3 <= fund
                            && total1 + total2 + total3 >= fund - limit) {
                        double currentCost = total1 + total2 + total3;
                        if (currentCost > maxCost) {
                            maxCost = currentCost;
                            amountOfMaxCostOptional = Optional.of(new Amount(amt1, amt2, amt3));
                        }
                    }
                }
            }
        }

        amountOfMaxCostOptional.ifPresent(amountOfMaxCost -> {
            double remainder =
                    fund - (amountOfMaxCost.getAmt1() * price1 + amountOfMaxCost.getAmt2() * price2
                            + amountOfMaxCost.getAmt3() * price3);
            System.out.println(
                    fmt.format(remainder) + ", " + fmt.format(amountOfMaxCost.getAmt1()) + ", "
                            + fmt.format(amountOfMaxCost.getAmt2()) + ", " + fmt
                            .format(amountOfMaxCost.getAmt3()));
        });
        scan.close();
    }

    private static class Amount {
        private double amt1;
        private double amt2;
        private double amt3;

        public Amount(double amt1, double amt2, double amt3) {
            this.amt1 = amt1;
            this.amt2 = amt2;
            this.amt3 = amt3;
        }

        public double getAmt1() {
            return amt1;
        }

        public double getAmt2() {
            return amt2;
        }

        public double getAmt3() {
            return amt3;
        }
    }
}
0 голосов
/ 18 октября 2019

Если вам не нужно, чтобы решение было эффективным, самый простой метод - это просто исчерпывающий поиск. Это пробует все комбинации и сравнивает их с «лучшими».

Код может быть немного более элегантным, если вы создадите вложенный класс для хранения «комбинации»:

private class Combination {
    public Combination(int amount1, int amount2, int amount3) {
        ...
    }

    public int getCost() {
        ...
    }
}

ТогдаВаш пробный код становится намного проще:

Optional<Combination> best = Optional.empty();
for (int amount1 = ...) {
    for (int amount2 = ...) {
        for (int amount3 = ...) {
            Combination combo = new Combination(amount1, amount2, amount3);
            int cost = combo.getCost();
            if (cost < limit && (best.isEmpty() || cost > best.get().getCost()))
                best = Optional.of(combo);
        }
    }
}

Это можно улучшить с помощью Iterable<Combination>, чтобы свернуть вложенный цикл for, но это, вероятно, сложнее, чем вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...