• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sprawdzarka daje błędny wynik, zadanie typu "czy da się wydać resztę?"

Object Storage Arubacloud
0 głosów
134 wizyt
pytanie zadane 5 marca 2020 w C i C++ przez gryzedywany Użytkownik (510 p.)
edycja 5 marca 2020 przez gryzedywany

Mam problem z tym zadaniem, napisałam już kod jednak w sprawdzarce wyskakuje błędny wynik :/ Domyślam się, że w którymś miejscu może wychodzić poza tablicę ale nie mogę tego wychwycić, albo może chodzi jeszcze o co innego. 

Poniżej wklejam mój kod i treść zadania.

#include <cstdio>
#include <iostream>
using namespace std;
 bool bankomat(int T[2][5],int k)
   {
        for (int i=4; i>=0;i--)
            if (T[1][i]>0 and k>=T[0][i])
            {
                do
                {
                    k=k-T[0][i]; //odejmuje nominal banknotu od kwoty do wyplaty
                    T[1][i]--; //zmniejszenie ilosci banknotow mozliwych do wyplaty
                }
                while (k>0 and T[1][i]>0 and k>=T[0][i]);
            }
        if (k==0)
                return true;
        else return false;
    }
int main ()
{

    int d, k; //d-ilosc zestawow k-ile wyplacic
    int T[2][5];
    T[0][0]=10;  //nominaly banknotow
    T[0][1]=20;
    T[0][2]=50;
    T[0][3]=100;
    T[0][4]=200;
    cin>>d;
    for (int j=0;j<d;j++ )

    {

        for (int i=0; i<5;i++)
        {
            cin>>T[1][i]; //wpisanie ilosci okreslonych banknotow do tablicy
        }
        // cout<<"wpisz kwote";
        cin>>k;
        if (bankomat (T,k)){
            cout<<"TAK"<<endl;
        }
        else cout<<"NIE"<<endl;
    }
return 0; }

BANKOMAT

Jako znany na świecie informatyk dostałeś ofertę od nowopowstającego banku szwajcarskiego na napisanie części oprogramowania dla bankomatów. Twój program ma sprawdzać czy przy pomocy dostępnych banknotów jest w stanie wypłacić żądaną przez klienta kwotę.
Wejście
W pierwszej linii znajduje się liczba D, oznaczająca liczbę zestawów danych. Każdy zestaw danych mieści się w jednej linii i składa się z sześciu liczb: a1, a2, a3, a4, a5, k (ai<=1000, k<=10000). Liczby a1..a5 oznaczją dostępną w bankomacie liczbę banknotów odpowiednio o nominałach 10, 20, 50, 100, 200 franków szwajcarskich. Natomiast liczba k oznacza żądaną kwotę do wpłaty.
Wyjście
Dla każdego zestawu danych powinna pojawić się jedna linia w wyniku zawierająca pojedyncze słowo TAK lub NIE, oznaczające czy w danej chwili w bankomacie da się wypłacić żądaną kwotę.
Przykład:
Wejście
3
0 2 10 10 1000 110
1 2 10 10 1000 110
199 100 40 20 10 10000
Wyjście
NIE
TAK
NIE

P.S. Kolejność wypisywania "NIE'"/"TAK" nie powinna mieć znaczenia, przerobiłam już ten program na (co prawda bardziej toporną wersję) która całe wyjście wyświetlała po sobie, ale wg sprawdzarki też zwracało błędny wynik w jakimś teście :/ 
 

1 odpowiedź

0 głosów
odpowiedź 5 marca 2020 przez Whistleroosh Maniak (56,980 p.)
wybrane 1 maja 2020 przez gryzedywany
 
Najlepsza
Próbujesz to rozwiązać zbyt zachłannym algorytmem. Zawsze próbujesz odjąć największy dostępny nominał, ale to nie zawsze będzie działać. Zobacz, że dla tych danych wejściowych Twój program wypisze "NIE":

1

0 3 1 0 1 260

A przecież można wziąć jedną 200 i trzy 20. Tutaj potrzebne będzie rozwiązanie wykorzystujące programowanie dynamiczne. Poczytaj sobie o problemie plecakowym i jak go rozwiązać.

Podobne pytania

0 głosów
2 odpowiedzi 816 wizyt
pytanie zadane 19 stycznia 2020 w C i C++ przez xZenit Użytkownik (760 p.)
0 głosów
1 odpowiedź 252 wizyt
pytanie zadane 30 sierpnia 2022 w C i C++ przez benny13 Obywatel (1,150 p.)
0 głosów
1 odpowiedź 165 wizyt

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...