Определить, можно ли составить число с предварительно выбранными числами и временем

У меня есть 2 массива: один из типов чисел, которые будут использоваться, а второй массив — сколько раз можно использовать это число. У меня есть буква, которая определяет, какой метод будет использоваться. Мне нужно выяснить, сколько раз я могу использовать определенное число из массива, чтобы определить букву + число. «Число» - это то, что я должен сделать со всеми доступными числа, которые я могу использовать. Если номер не может быть создан, я хотел бы просто сказать, что номер не может быть составлен или что-то еще, но позволить программе двигаться дальше. Вот что у меня есть

int[] picksToUse = { 100, 50, 20, 10, 5, 1 };
int[] timesToUse = { 10, 10, 10, 10, 10, 10 };
string choice = Console.ReadLine();
string input = "";
if (choice.Length > 2)
{                    
     input = choice.Substring(choice.IndexOf("$") + 1);
}
if (...){
}
else if (choice.Equals("D")) 
{
     int amt = Convert.ToInt32(input);
 // code here to determine if number can be made with above choices
    Dispense(amt, timesToUse);
}

Это не JavaScript.

Jack Bashford 10.02.2019 03:29

C#, но думает так же, как это сделать

Bigbear 10.02.2019 03:31

Вы случайно не делаете римские цифры?

laancelot 10.02.2019 03:44

Нет, я работаю как банкомат? Кассовый аппарат отслеживает оставшиеся счета, и если у меня заканчивается определенный счет, поэтому я не могу ввести введенное число, которое хочу отобразить, не могу сделать

Bigbear 10.02.2019 04:39

не могли бы вы поделиться образцом ввода? Д___ ?

Anu Viswan 10.02.2019 05:00

Вы не против рекурсии? Я думаю, что рекурсивная функция с логическим возвратом могла бы сказать вам, работает она или нет, в нескольких строках, и тогда вам нужно было бы беспокоиться только о фактическом выполнении транзакции (или нет).

laancelot 10.02.2019 05:09
dotnetfiddle.net/#&togetherjs=laV8vwH1N1
Bigbear 10.02.2019 06:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
7
67
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Предполагая, что picksToUse и timesToUse точно такие же, как вы их объявили, вот способ узнать, достаточно ли у вас всего на складе, чтобы «заплатить». Это логическая функция, использующая рекурсию. Вы бы вызвали его с необходимой суммой в качестве параметра, и он тут же сказал бы вам, достаточно ли у вас всего.

Private Function HasCashInStock(amount As Integer, Optional index As Integer = 0) As Boolean
    Dim billsNeeded As Integer = amount \ picksToUse(index)

    If billsNeeded > timesToUse(index) Then
        Return False
    End If

    amount -= picksToUse(index) * billsNeeded

    If amount = 0 Then
        Return True
    End If

    Return HasCashInStock(amount, index + 1)
End Function

\ — это оператор целочисленного деления (по крайней мере, в VB.NET — я без зазрения совести позволяю вам переводить этот код). Если вы не знакомы с оператором целочисленного деления, что ж, когда вы используете его с целым числом, он избавляется от плавающих чисел.

3 / 2 не работает с целыми числами, потому что это даст 1,5.

3 \ 2 действителен для целых чисел и даст 1.

Вот и все, на самом деле. Ах да, и рекурсия. Мне нравится рекурсия, но другие скажут вам избегать ее, насколько это возможно. Что я могу сказать, я думаю, что хорошая рекурсивная функция имеет элегантность.

Вы также можете полностью скопировать эту функцию в другой раз, изменить ее и использовать для вычитания из вашего массива timesToUse(), как только вы будете уверены, что всего достаточно для оплаты.

If HasCashInStock(HereIsTheAmountAsInteger) Then
    GivesTheMoney(HereIsTheAmountAsInteger)
End If

Наличие двух функций — не самый простой код, но он был бы более читабельным. Развлекайся!

У меня есть метод, поэтому я получаю нужное мне количество счетов, а также отслеживаю все счета, которые у меня остались. Я думаю, мне нужен такой метод, как: public static bool Validate (int amount, int [] total, int [] Needed) {

Bigbear 10.02.2019 06:13

public static bool Validate(int amount, int[] total, int[] Needed) Я хочу стать лучше в рекурсии. Я посмотрю на ваш VB и посмотрю, смогу ли я проверить с ним свою дозу()

Bigbear 10.02.2019 06:20

Мой код использует индекс вашего массива для рекурсивного поиска, есть ли у вас все необходимые счета. Возвращает истину или ложь. Как только вы точно знаете, есть ли у вас счета, вам не нужно проверять их дважды, поэтому вы можете просто повторно использовать тот же метод, но на этот раз немного изменить код, чтобы вместо подсчета счетов он вычитал их из вашего «банка». " (и этот метод может быть Void, потому что вам не нужно ничего возвращать, это будет просто часть "выполнение работы, теперь мы знаем, что должны это сделать").

laancelot 10.02.2019 07:32
Ответ принят как подходящий

Это то, что я использовал, чтобы закончить свой проект.

 public static bool Validate(int amount, int[] total, int[] needed)
    {
        int[] billCount = total;
        int[] cash = { 100, 50, 20, 10, 5, 1 };
        int total = amount;
        bool isValid = true;
        for (int i = 0; i < total.Length; i++)
        {
            if (total >= cash[i])
            {
                billCount[i] = billCount[i] - needed[i];
            }
            if (billCount[i] < 0)
            {
                isValid = false;
                break;
            }
        }
        return isValid;
    }

У меня есть рабочий код. Я сделал это с классом. Я помню, когда я не мог видеть, что такое хорошие уроки. Теперь я не могу чистить зубы без занятий. :-)

Я заставляю себя решать эти задачи, чтобы набраться опыта в C#. Теперь у меня есть 3 вещи, которые мне нравятся в C#.

    class ATM
    {
        public int Denomination { get; set; }
        public int Inventory { get; set; }
        public ATM(int denom, int inven)
        {
            Denomination = denom;
            Inventory = inven;
        }
    }
    List<int> Bills = new List<int>();
    List<ATM> ATMs = new List<ATM>();
    private void OP2()
    {
        int[] picksToUse = { 100, 50, 20, 10, 5, 1 };
        foreach (int d in picksToUse )
        {
            ATM atm = new ATM(d, 10);
            ATMs.Add(atm);
        }
        //string sAmtRequested = Console.ReadLine();
        string sAmtRequested = textBox1.Text;
        if (int.TryParse(sAmtRequested, out int AmtRequested))
        {
            int RunningBalance = AmtRequested;
            do
            {
                ATM BillReturn = GetBill(RunningBalance);
                if (BillReturn is null)
                {
                    MessageBox.Show("Cannot complete transaction");
                    return;
                }
                RunningBalance -= BillReturn.Denomination;
            } while (RunningBalance > 0);
        }
        else
        {
            MessageBox.Show("Non-numeric request.");
            return;
        }
        foreach (int bill in Bills)
            Debug.Print(bill.ToString());
        Debug.Print("Remaining Inventory");
        foreach (ATM atm in ATMs)
            Debug.Print($"For Denomination {atm.Denomination} there are {atm.Inventory} bills remaining");
    }
    private ATM GetBill(int RequestBalance)
    {
        var FilteredATMs = from atm in ATMs
                           where atm.Inventory > 0
                           orderby atm.Denomination descending
                           select atm;

        foreach (ATM bill in FilteredATMs)
        {
            if (RequestBalance >= bill.Denomination )
            {
                bill.Inventory -= 1;
                Bills.Add(bill.Denomination);
                return bill;
            }
        }
        return null;
    }

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