Forum Instytutu Matematycznego UWr

Teraz jest niedziela, 17 listopada 2019 23:42

Strefa czasowa: UTC + 1 [ DST ]




Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 
Autor Wiadomość
PostNapisane: środa, 02 grudnia 2009 11:57 
Offline

Dołączył(a): sobota, 28 listopada 2009 14:27
Posty: 20
Witam
Chcialem sie dowiedziec czy jest jakies matematyczne rozwiazanie ponizej podanej zagadki. Czy nalezy ja rozwiazywac metada prob i bledow czy jednak da sie wyprowadzic jakis wzor badz zachowujac logiczne myslenie i korzystajac z wiedzy matematycznej rozwiazac ja.

Złodziej ukradł z perfumerii butelkę drogich perfum i trzy puste flakoniki. Złodziej ów miał trzy kochanki, między które chciał po równo podzielić łup. Okazało się wówczas, że w butelce jest 30 ml perfum, zaś pojemności pustych flakoników wynoszą odpowiednio 14, 12 i 6 ml.

W jaki sposób podzieli zdobycz na 3 równe części ?


Pozdrawiam


Góra
 Zobacz profil  
 
 Tytuł:
PostNapisane: czwartek, 03 grudnia 2009 2:36 
Offline
Avatar użytkownika

Dołączył(a): czwartek, 24 września 2009 21:38
Posty: 911
Płeć: mężczyzna
wydaje mi sie ze w ogolnosci takie rzeczy najlepiej widziec jako problem do rozwiazania przy uzyciu programowania dynamicznego, albo znajdowania najkrotszej sciezki w grafie skierowanym, chociaz to tez jest metoda prob i bledow, tylko troche sprytniej zrobiona. ;)
jedyna trudnosc to napisanie procedury znajdujacej krawedzie, ale to chyba nie powinno byc takie trudne. no i wlasciwie zinterpretowanie tresci zadania...
==edit==
w tym wypadku o tak, bez wiekszych optymalizacji, dziala wystarczajaco szybko, powinno dac sie uogolnic:
Kod:
maxis=[30,14,12,6]
que=[[30,0,0,0]]
wfrom={}
goal=[[10,10,10,0]]
def bfs(gl=goal):
    global que
    cr=(que[0])
    wfrom[tuple(cr)]=cr
    while(cr not in goal):
        try:
            cr=(que[0])
        except:
            print "Nie da sie."
            return False
        que=que[1:]
       
        for i,n in enumerate(cr):
           if n!=0:
            for j,m in enumerate(cr):
                if j!=i and m!=maxis[j]:
                    nxt=cr[:]
                    nxt[j]=min(m+n,maxis[j])
                    nxt[i]=max(0,n-maxis[j]+m)
                    if tuple(nxt) in wfrom:
                        continue
                    wfrom[tuple(nxt)]=cr
                    que.append(nxt)
    return cr
rt=bfs()
if(rt):
    cr=rt
    pr=[cr]
    while(1):
        test=wfrom[tuple(cr)]
        if test==cr:
            break
        cr=test
        pr=[test]+pr
    for point in pr:
        print point


Góra
 Zobacz profil  
 
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 

Strefa czasowa: UTC + 1 [ DST ]


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
POWERED_BY
Przyjazne użytkownikom polskie wsparcie phpBB3 - phpBB3.PL