Pomoc w algorytmie na ilosc sposobow zapisu liczby

0

Witam wszystkich.
Mam maly problem natury algorytmicznej. Nie mam mianowicie pomyslu jak rozwiazac pewien problem, byc moze ktos z szanownych forumowiczow na taki pomysl natrafi.
Chodzi o to, ze mamy dana liczbe X zapisac w postaci dodawania liczb ze zbioru 1,5,10,25,50

Tak oto liczbe 7 da sie zapisac na dwa sosoby: 1+1+1+1+1+1+1 oraz 5+1+1
liczbe 4 na jeden sposob: 1+1+1+1

myslalem ze mozna by zrobic tak:
Kazda z liczb ze zbioru rozpisac w taki wlasnie sposob tak oto:
1 mozna zapisac na 1 sposob
5 mozna zapisac na 2 sposoby
10 mozna zapisac na 4 sposoby (110 ; 5+5 ; 5+51 ; 10)
...

Moj sposob (nie dopracowany / nie dzialajacy):Teraz majac liczbe (np 14)
dziele ja przez 10 calkowicie - wynik wychodzi 1 teraz sprawdzam ze 10 mozna rozpisac na 4 sposoby
reszte 4 sprawdzam ze mozna zapisac na jeden sposob.
razem wychodzi 4+1=5 - 5 sposobow zapisu liczby 14;
Jednak nie jestem pewien (nie mam mozliwosci sprawdzenia) jak bedzie to sie zachowywac dla b.duzych liczb takich jak np. 343 itd.

Poprosilbym o jakis schemat, ktory dziala tak bym mogl sie przekonac.
Dziekuje za poswiecenie uwagi temu problemowi.

0

Ja nie bardzo rozumiem: masz zadanie, masz na nie pomysł i nie wiesz czy dla dyżych liczb będzie działać?
Czego oczekujesz od forumowiczów? Że Twój pomysł działa dla liczby 343?
A o jaki schemat Ci chodzi?

0

Oto moja wizja:

var
 s :string; // tu zapisujemy wynik dodawania
 i :Byte; // licznik pętli operujący na zbiorze 
 v :Word; // zmienna rozkkładana
const
 z :array [1..6] of Byte = (1,5,10,15,20,50); // tu ustal dowolnie

begin
 v := 500;
 for i := 6 downto 1 do // zaczynamy od odejmowania największych cyfr
  while v >= z[i] do // sprawdzasz ile razy można odjąć
   begin
    v := v - z[i]; // odejmujesz
    s := IntToStr(z[i])+'+'+s; //eleganko zapisujemy
   end;
 label1.Caption := s;
end;

Mniej więcej na takiej zasadzie działają automaty do wydawania reszty. Uzyłem też czegoś podobnego do zamiany cyfry na rzymski odpowiednik. Do obliczenia ilości sposobów potrzebna jest trzecia pętla.

0

Dziekuje za odzew, ale bardziej interesuje mnie sposob, papierkowy algorytm etc, a zagadnienie jest takie:

"Na ile SPOSOBOW mozna zapisac dana liczbe majac do dyspozycji cyfry 1 , 5 , 10 , 25 , 50"

0
Autor napisał(a)

Dziekuje za odzew, ale bardziej interesuje mnie sposob, papierkowy algorytm etc, a zagadnienie jest takie:

"Na ile SPOSOBOW mozna zapisac dana liczbe majac do dyspozycji cyfry 1 , 5 , 10 , 25 , 50"

Na moj gust to jest tak:
Do zapisu tych specjalnych liczb mozesz uzywac odpowiednio licz poprzednich, czyli np. 10 uzywajac 10, albo 5, albo 5 i 1, albo samych 1.
Jezeli masz liczbe np. 343 to zapisujesz ja za pomoca najwiekszej dostepnej liczby czyli 50.
Wychodzi Ci
50+50+50+50+50+50+10+10+10+10+1+1+1
(jak z automatem do reszty).
I teraz robisz tylko kombinacje tego na ile sposobow mozesz zapisac cala reszte, czyli poszczegolne 10 i 50 - zwrocmy tez uwage, ze zapis 50 rozklada sie znowu na kilka 10 miedzy innymi.
Przyjmujac, ze np. 50 mozna zapisac na zalozmy 10 sposobow (nie chce mi sie liczyc) a 10 na sposobow 4 to zapis 343 to 6x sposoby 50 + 4x sposoby 10 + ten jeden unikalny sposob.

Chyba sie nie machnalem :P

pozdrawiam
johny

0

Jeżeli nic nie zdziałasz, zobacz: http://mathworld.wolfram.com/Partition.html i dalej "greedy algorithm".

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