Programowanie zachłanne na przykładzie wydawania reszty

Programowanie zachłanne. Algorytm wydawania reszty:

PROBLEM: Wydaj resztę najmniejszą ilością monet w dostępnych nominałach.

Zapoznaj się z poniższym dokumentem:


lub pobierz go: zachłanny algorytm wydawania reszty

Koduj sam, ale film może Ci pomóc:

W filmie:

  • co to jest programowanie zachłanne?
  • założenia dp problemu wydawania reszty,
  • przygotowanie do kodowania,
  • napisanie kodu w C++,
  • przykłady uruchomienia w przypadkach optymalnych,
  • przykład, w którym metoda zachłanna NIE daje najlepszego wyniku.

Kod napisany w powyższym filmie:

/* Zachłanny algorytm wydawania reszty.
Założenia:
	1) tablica nominałów posortowana MALEJĄCO
	2) ilość każdego nominału NIE jest ograniczona
	3) zawsze jest możliwe wydanie reszty do 0 (ostatni nomimał to 1)
	4) reszta jest liczbą naturalną */
#include <iostream>
#include <string>
using namespace std;
int main(){
	//int nominal[]={6, 4, 1}; // Tablica dostępnych nominałów
	int nominal[]={500, 200, 100, 50, 20, 10, 5, 2, 1}; // Tablica dostępnych nominałów
	int l_nominalow = sizeof(nominal) / sizeof(int); // Ilość elementów tablicy
	int reszta; // Reszta do wydania
	int ilosc = 0; // Łączna ilość "monet" potrzebna do wydania reszty
	int pozycja = 0; // Pozycja aktuanego nominału z tablicy nominałów. Zaczynamy od początku (od największego nominału)
	int i, moneta;
	cout << "dostepne nominaly (monety): \n";
	for(i=0; i<l_nominalow; i++) cout << nominal[i] << " ";
	cout << "\nreszta do wydania: "; cin >> reszta; //Wczytanie wartości reszty do wydania
	cout << endl;
	while(reszta>0){ //Dopóki mamy co wydawać, to wydajemy
		while(nominal[pozycja]>reszta) pozycja++; //Ustalenie największej monety <= od aktualnej reszty
		cout << "aktualna pozycja: " << pozycja;
		moneta=nominal[pozycja]; // Moneta - wartość nominału dla określonej pozycji
		cout << "  moneta: " << moneta;
		cout << "  ilosc monet: " << reszta/moneta; // Ilość monet, które mieszczą się w reszcie
		ilosc=ilosc+reszta/moneta; // Obliczanie łacznej ilości monet potrzebnej do wydania reszty
		reszta=reszta%moneta; // Obliczenie nowej wartości reszty
		cout << "  reszta: " << reszta << endl;	
	}
	cout << "\ncalkowita ilosc potrzebnych monet do wydania reszty: " << ilosc;
	return 0;
}

Wykorzystanie kodów:

  • Powyższy kod można wykorzystać w środowisku Dev C++ lub innym. Wystarczy utworzyć nowy projekt i wkleić ten kod zamiast istniejącego.
  • Można też użyć kodu na jednej ze stron WWW z kompilatorami on-line, na przykład na stronie: www.cpp.sh