Problem wydawania reszty

0

Witam, chciałbym zrobić mini program który będzie obliczał jednostki.

Np mamy podane

C 15 = 11zl
C 20 = 13zl
C 25 = 15zl
C 32 = 17zl
C 40 = 20zl
C 50 = 25zl
C 65 = 30zl
C 80 = 35zl
C 100 = 40zl
C 125 = 50zl
i program musi dodawać do siebie liczby żeby wyszedł wynik bez reszty np 3135:
to bedzie
C 125 * 60,
C 32 * 6,
C 15 * 3;
wynik = 3135;

Niestety nie wiem jak zabrać się za to czy jakaś dobra duszyczka by mi pokierowała od czego zacząć?

4

O ile Cię dobrze zrozumiałem — znajdź sobie w ulubionej wyszukiwarce hasło „algorytm zachłanny”.

0
Althorion napisał(a):

O ile Cię dobrze zrozumiałem — znajdź sobie w ulubionej wyszukiwarce hasło „algorytm zachłanny”.

Dzięki!
Udało mi się stworzyć coś takiego i efekt jest jak na poniższym screenie ale nadal nie wiem jak to zrobić żeby obliczyło mi dokładnie kwotę (chce zeby dobieral tak ze soba liczby zeby wyszlo bez reszty):
screenshot-20220407101644.png

int main() {
	string tab[11][11] = {"C 15", "C 20", "C 25", "C 32", "C 40", "C 50", "C 65", "C 80", "C 100", "C 125"};
	int tab2[11] = {11, 13, 15, 17, 20, 25, 30, 35, 40, 50};
	int kwota;
	int a = 0, b = 0, i = 0;
	
	cout<<"Podaj kwote ";
	cin>>kwota;

	cout << "Ilosc\t\t" << " Cena za jednostke \t\t" << " Cena za calosc (ilosc jednostki * cena jednostki) "<<endl<<endl;
	while(kwota>0)
	{
		if(kwota >= tab2[i])
		{
			a=kwota/tab2[i];
			kwota=kwota-(tab2[i]*a);
			cout<<tab[0][i]<<" x "<<a<<"\t\t"<<tab2[i]<<"\t\t\t"<<a*tab2[i]<<endl;
		}
		i++;
	}
	
}
0

@Karol Wojtyla:

Eminencja poczyta o dzieleniu w liczbach całkowitych.
Interpunkcja godna poprzednika też nie zaszkodzi.

4

Czy ja dobrze rozumiem że :

  1. Masz podaną kwotę
  2. Masz podane dostępne nominały
  3. Chcesz przedstawić podaną kwotę za pomocą tych nominałów

? To się nazywa problem wydawania reszty https://pl.wikipedia.org/wiki/Problem_wydawania_reszty

0

Niestety mimo ze zastosowałem wydawanie reszty to nie potrafię wyjść z jednej rzeczy mianowicie aktualnie program dziala tak
Dla kwoty 172 program wypisuje nominaly 50, 50, 50 i 20 (zostaje reszty 2 bo w nominale najmniejsza liczba jest 11) zamiast 50 50 50, 11, 11

1
Karol Wojtyla napisał(a):

Niestety mimo ze zastosowałem wydawanie reszty to nie potrafię wyjść z jednej rzeczy mianowicie aktualnie program dziala tak
Dla kwoty 172 program wypisuje nominaly 50, 50, 50 i 20 (zostaje reszty 2 bo w nominale najmniejsza liczba jest 11) zamiast 50 50 50, 11, 11

Pokaż kod.

0
TomRiddle napisał(a):
Karol Wojtyla napisał(a):

Niestety mimo ze zastosowałem wydawanie reszty to nie potrafię wyjść z jednej rzeczy mianowicie aktualnie program dziala tak
Dla kwoty 172 program wypisuje nominaly 50, 50, 50 i 20 (zostaje reszty 2 bo w nominale najmniejsza liczba jest 11) zamiast 50 50 50, 11, 11

Pokaż kod.

#include <iostream>
using namespace std;

int main() {
	string tab[11][11] = {"C 125", "C 100", "C 80", "C 65", "C 50", "C 40", "C 32", "C 25", "C 20", "C 15"};
	int tab2[11] = {50, 40, 35, 30, 25, 20, 17, 15, 13, 11};
	int kwota;
	int a = 0;
	
	cout<<"Podaj kwote ";
	cin>>kwota;

	cout << "Ilosc\t\t" << " Cena za jednostke \t\t" << " Cena za calosc (ilosc jednostki * cena jednostki) "<<endl<<endl;
	
	while (kwota > 0) {
        int n = 0;
        for (int i = 0; i < 10; ++i) {
            if ((tab2[i] <= kwota) && (tab2[i] > n)) {
                n = tab2[i];
                cout<<tab[0][i]<<" x "<<kwota/tab2[i]<<"\t\t"<<tab2[i]<<"\t\t\t"<<a*tab2[i]<<endl;
            }
        }
        kwota -= n;
        ++a;
    }
	
}
1
Karol Wojtyla napisał(a):
TomRiddle napisał(a):
Karol Wojtyla napisał(a):

Niestety mimo ze zastosowałem wydawanie reszty to nie potrafię wyjść z jednej rzeczy mianowicie aktualnie program dziala tak
Dla kwoty 172 program wypisuje nominaly 50, 50, 50 i 20 (zostaje reszty 2 bo w nominale najmniejsza liczba jest 11) zamiast 50 50 50, 11, 11

Pokaż kod.

#include <iostream>
using namespace std;

int main() {
	string tab[11][11] = {"C 125", "C 100", "C 80", "C 65", "C 50", "C 40", "C 32", "C 25", "C 20", "C 15"};
	int tab2[11] = {50, 40, 35, 30, 25, 20, 17, 15, 13, 11};
	int kwota;
	int a = 0;
	
	cout<<"Podaj kwote ";
	cin>>kwota;

	cout << "Ilosc\t\t" << " Cena za jednostke \t\t" << " Cena za calosc (ilosc jednostki * cena jednostki) "<<endl<<endl;
	
	while (kwota > 0) {
    int n = 0;
    for (int i = 0; i < 10; ++i) {
        if ((tab2[i] <= kwota) && (tab2[i] > n)) {
            n = tab2[i];
            cout<<tab[0][i]<<" x "<<kwota/tab2[i]<<"\t\t"<<tab2[i]<<"\t\t\t"<<a*tab2[i]<<endl;
        }
    }
    kwota -= n;
    ++a;
}
	
}

No to chyba już widzisz gdzie masz błąd, nie?

Ten ifik u Ciebie if ((tab2[i] <= kwota) && (tab2[i] > n)) { sprawdza następny nominał do wzięcia. Pod odjęciu 50tek, zostaje Ci 22, i ifik bierze 20tkę, bo nie wie że mu braknie nominału na pozostałą 2kę.

0

Właśnie to zauważyłem tylko nie mam rozwiązania na to. Próbowałem zamienić warunek na

if ((tab2[i] <= kwota) && (tab2[i] > n) && (n < tab2[i-1]))

wtedy przy 172 zostawała reszta 1 bo zamiast 50tek liczyło cztery 40stki i jedna 11stka, a powinno zrobić np. trzy 50tki i dwie 11nastki

1
Karol Wojtyla napisał(a):

Właśnie to zauważyłem tylko nie mam rozwiązania na to. Próbowałem zamienić warunek na

if ((tab2[i] <= kwota) && (tab2[i] > n) && (n < tab2[i-1]))

wtedy przy 172 zostawała reszta 1 bo zamiast 50tek liczyło cztery 40stki i jedna 11stka

Ale tak spytam, jak masz te nominały {50, 40, 35, 30, 25, 20, 17, 15, 13, 11}; i ktoś da 23 to co ma zwrócić? 13 i reszty 10?

0

Po wielu kombinacjach i waszych radach udało mi sie stworzyć niemalże wszystko. Otoz jedne problemy mijaja rodzą się nowe. Chciałbym aby na podstawie rozbitych nominałów pokazywało tez tabele oraz prawidłowa liczbę mnożnika. Co byście tutaj zmienili/dodali?
screenshot-20220407161443.png

#include <iostream>
using namespace std;
 
int main()
{
	string tab[11][11] = {"CN 15", "CN 20", "CN 25", "CN 32", "CN 40", "CN 50", "CN 65", "CN 80", "CN 100", "CN 125"};
	int nominaly[11] = {11, 13, 15, 17, 20, 25, 30, 35, 40, 50};
    int kwota; int ilosc; int suma;
    cout << "Podaj kwote do rozbicia: ";
    cin >> kwota;
    
    cout << "Ilosc\t\t" << " Cena za jednostke \t\t" << " Cena za calosc (ilosc jednostki * cena jednostki) "<<endl<<endl;
    
    int n;
    int jaki_nom[kwota+1];
    int tablica[kwota+1];
    for (int i=0; i<kwota+1; i++) {tablica[i]=INT_MAX;} tablica[0]=0;
 
	    for(int i=0; i < 10; i++)
    {
        for(int j=0; j < kwota; j++){
            if(tablica[j]!=INT_MAX)
            {
                int nowa_kwota = j + nominaly[i];
                int nowa_ilosc = tablica[j]+1;
                if((nowa_kwota <= kwota) && (nowa_ilosc < tablica[nowa_kwota]))
                {
                    tablica[nowa_kwota] = nowa_ilosc;
                    jaki_nom[nowa_kwota]=nominaly[i];
                    suma = tablica[j]+1;
				}
            }
        }
        if(kwota >= nominaly[i]) {
		cout<<tab[0][i]<<" x "<<kwota/nominaly[i]<<"\t\t"<<nominaly[i]<<"\t\t\t"<<nominaly[i]*suma<<endl; // ta linijka odpowiada za wyswietlanie tabeli
		
		}
    }
    	if(tablica[kwota]==INT_MAX)
    	{
        cout <<endl<< "NIE DA SIE WYPLACIC KWOTY"<<endl<<endl;
        for(int i=0; i<kwota+1; i++)
        {
            cout<<tablica[i]<<"   ";
        }
        cout<<endl;
    }
    else
    {
        int tmp_kwota=kwota;
 
        cout<<endl<<"Rozbite nominaly: "<<endl<<endl;
        while(tmp_kwota!=0)
        {
            cout<<jaki_nom[tmp_kwota]<<", ";
            tmp_kwota-=jaki_nom[tmp_kwota];
        }
	}	
   	
    return 0;
}


0

Odświezam. Serio nie macie pomysłów? D:

0
Karol Wojtyla napisał(a):

Odświezam. Serio nie macie pomysłów? D:

Ale masz jaki kolwiek powód pisać ten algorytm? Bo skoro masz krótką listę możliwych inoutow wartości, to może po prostu wpisz na sztywno jakie wartości mają wyjść?

1 użytkowników online, w tym zalogowanych: 0, gości: 1