• Здраво и добредојдовте на форумот на IT.mk.

    Доколку сеуште не сте дел од најголемата заедница на ИТ професионалци и ентузијасти во Македонија, можете бесплатно да се - процесот нема да ви одземе повеќе од 2-3 минути, а за полесна регистрација овозможивме и регистрирање со Facebook и Steam.

Логички проблем

  • Ја почнал/а темата
  • #1

fuUuUzZzZy

On your way to fame
14 декември 2007
4,842
885
Ohrid
Вака.. проблемов е малце логички како што и ја именував темава.. Прво ќе го напишам па потоа ќе објаснам и јас како мислам.. Доколку некој има некое друго полесно решение крајно ќе му бидам благодарен :)

Значи, се работи за програма која ќе ми смета остаток на парчиња... Стандард шипка е 600 cm ( 6 метра) , а јас на лаѓер имам повеќе помали парчиња ( ex. 350 cm, 120 cm, 480 cm, 400 cm, 160 cm и 60 cм ) и сега би сакал програмава да може да ми искомбинира една величина составена од овие 6 што ги набројав, а која ќе е <= 600 cm ( 6m ) но со најмал остаток.. Значи да си направи комбинации и збирот од тие што се најблиску до 600 cm ( 6 m) да го изложи.. Сложено е за објаснување, но се надевам ме сфативте..

Е сега.. Мојава идеа е, на пример да поставам 6 линии ( text box ) и да ги именувам како: A ; B ; C ; D ; E ; F .. И сега кодот за ова би бил:
a + b = ab
b + c = bc
c + d = cd
d + e = de
e + f = ef
..
a + b + c = abc
b + c + d = bcd
c + d + e = cde
..
Значи да направам разни комбинации и крајно овие сите да ги спореди и тоа што е најблиску до 6 метра да го изложи, т.е најголемата цифта од сите „валидни„ ( <= 600 cm ) да ја изложи..

И конечно, да претпоставиме дека ме сфативте што ми е идеата, и:
1. дали некој воопшто има полесна идеа од ова ( за да не внесувам милион комбинации ) ?
2. Која е функцијата за споредба на добиените величини т.е како можам да му зададам команда да ги спореди сите „ВАЛИДНИ„( <= 600 cm ( 6m ) ) добиени вредности ( ab ; bc ; cd ; abc ; bcd ..) и да ја изложи најголемата ?

Фала однапред.

пс. Да не сфатите погрешно, тие 6 набројани се променливи.. Значи не се работи само стрикно со тие, т.е може да има и 5 * 60 cm и 1 * 20 или слично.. Тие се само пример...
 

MetalGear

On your way to fame
14 април 2007
2,997
510
www.ibiz.mk
има полесен начин

прво парчињата ке ти сортираш и ке почнеш почнувајки од најголемото парче да одземаш од шипката додека можеш

пример
шипката е 600см а најголемото парче 130см
ке одземаш до 520см тоа се 4 парчиња од
останува уште 80 идеш на наредно парче доколку е поголемо од 80 го прескокнуваш и се до она на кое можеш да одземаш се до крајот на низата на парчиња ке има и ситуации на кои ке ти остане но на овој начин ке се мининални.

имав сличен проблем но само со монети беше за испит :))

ако не ти е јасно пиши

позз
 

Alexandar

Gaining Experience
21 мај 2007
2,514
90
На пример ако имаш 3 парчиња, програмата се решава со 3 вгнездени for циклуса. Пример ако имаш парчиња од 15, 60 и 90 cm, програмата би изгледала вака:

for i = 1 to (600/15)
for j = 1 to (600/60)
for k = 1 to (600/90)
if (i*15 + j*60 + k*90) = 600
then ' zapisi gi nekade ili ispecati gi.

Со ова ги пробуваш сите можни комбинации од парчиња со овие должини.
Не знам дали кодот ми е точен за Basic, но се надевам дека ги сфати целта и алгоритмот.
 

MetalGear

On your way to fame
14 април 2007
2,997
510
www.ibiz.mk
aleksandar тогаш алгоритмот ке има преголема сложеност за поголем број на парчиња

откако ке ги сортираш парчињата ке бидат сортирани во една матрица
и само со еден for циклус
во него еден do until команда да ти врти се додека остаток е поголем од парчето од кое зе одзема
е може и тука да ставиш уште една матрица за да ти ги брои парчињата на пример ако за парчиња е матрица "a" за броење нека е "abr" како сакаш

откако do until условот не е исполнет т.е. остатокот да е помал од парчето иде си на следно парче помало ке ја сортираш низата во опагачки редослед полесно да ти е

и се така до крај

на крај да испечатиш од кое парче колку дела има

едноставно
а[1] има abr[1] дела

се надевам дека ме свати

позз а кодирање тоа зависи од тебе во кој јазик ке биде
јас ти помогнав само во алгоритмот
позз
 
  • Ја почнал/а темата
  • #5

fuUuUzZzZy

On your way to fame
14 декември 2007
4,842
885
Ohrid
omg.. Фала многу @MetalGear тоа изгледа ќе ми ги скрати маките :D

Сосема те разбирам и ми даде супер решение. Сега уште да се потсетам конкретно за visual basic како одеше се тоа..
Доколку некој го разбира погоре наведениов принцип со for и until и знае точно конкретно за visual basic и ако не му е тешко нормално, нека наведе :)). Во секој случај решението веќе го имам .. Само да се вратам малце во форма после неколку години нечепнато visual basic..

Уште еднаш фала MetalGear а исто така и за aleksandar_te.
 

MetalGear

On your way to fame
14 април 2007
2,997
510
www.ibiz.mk
visual basic и јас немам работено многу одамна така да тоа не можам да ти помогнам

со сличен алгоритам положив кај ѓорѓи јованчевски по xx обиди
 

Alexandar

Gaining Experience
21 мај 2007
2,514
90
@MetalGear

Твојот алгоритам е побрз, но не и ефикасен во повеќето случаи. Нема да ги најде сите комбинации а некогаш и нема да даде баран резултат. Пример ако имаш парчиња од 17 и 30cm а треба да составиш парче од 34 cm. Според твојот алгоритам програмот ќе направи парче од 30cm и ќе го даде тоа како резултат. Според другиот, ќе состави парче 17+17=34cm и сите среќни и весели ќе продолжат да живеат :)
 

MetalGear

On your way to fame
14 април 2007
2,997
510
www.ibiz.mk
да александар не реков дека е совршен и дека е најдобар во сите ситуации но во поголем дел од ситуациите е подобар

е наравно ако сака fuzy да биде добар во сите ситуации
пред да почне ке си стави неколку услови да ги проверува сличните ситуации.
 

Alexandar

Gaining Experience
21 мај 2007
2,514
90
Ок, ок, меѓутоа при проверка на точноста на програмата секогаш се земаат и најекстремните вредности. Лани заради еден таков тест-пример не отидов на меѓународна олимпијада :)
 
  • Ја почнал/а темата
  • #10

fuUuUzZzZy

On your way to fame
14 декември 2007
4,842
885
Ohrid
хмммз.. Повторно малце заглавив со алгоритмот од александар :))
Ми избега од на IRC, па еве овде.. :LOL:
[01:31] <fuUuUzZzZy> sega ushte da najdam posle then koja treba da ja ispishi..
[01:32] <aleksandar_te> epa napravi: i parcinja so text1 golemina, j parcinja so text2 golemina i k parcinja so text3 golemina
[01:32] <aleksandar_te> ili kako podrugo planiras
[01:32] <aleksandar_te> zapisi gi vo txt dokument

Колку што го сфатив ова треба да ги распоредам сите посебно
на пример:


Код:
Private Sub Command1_Click()

 For i = 1 To (600 / Val(Text1))
 For j = 1 To (600 / Val(Text2))
 For k = 1 To (600 / Val(Text3))
 If (i * Val(Text1) + j * Val(Text2) + k * Val(Text3)) = 600 Then
  Text5.Text = i
  Text6.Text = j
  Text7.Text = k
  End If
    Next k
    Next j
    Next i
    End Sub
Но некако ми нема логика ова..
Фактички главно кодов е да ги врти посебно за секое парче од 1 до 600 / внесена_променлива, и вредноста од сите 3 која што ќе биде еднаква на 600 да биде бараната и да се запише..
Но според примерот ќе излезат 3 различно вредности, и некако ќе немаат логика..
Ајде помош ако сакате.. Некако не ми се јасни работиве.. :ermm:


А додека пак ако одам по алгоритмот од MetalGear мислам дека би требало да завршува кога остатокот ќе биде помал од сите внесени вредности, како на пример
if ostatok < val(a.text) AND val(b.text) AND val(c.text) and ... then
d.text = ostatok


затоа што ќе нема повеќе што да работи..

Во право сум, или пак некаде грешам? :ermm: :LOL:
 

MetalGear

On your way to fame
14 април 2007
2,997
510
www.ibiz.mk
Ок, ок, меѓутоа при проверка на точноста на програмата секогаш се земаат и најекстремните вредности. Лани заради еден таков тест-пример не отидов на меѓународна олимпијада :)
да во право си ова го дадов само како алгорирам програмскиот дел треба како услов пред да почне да се одвива алгоритмот да ги провери сите ситуации
во твој пример ке може со mod опцијата да му даде остаток и да се проверат сите парчиња доколку има некое парче на кое остаток со мод е 0 ке земе само од тоа парче во твојот пример 2*17 и воопшто нема да влегува во циклусот од алгоритмот.
уште подобра варијанта е
да проверува мод во for циклусот после секое парче

значи прво ке се провери со мод
па влегува во for одзема едно парче
пак влегува во нов for за да ги провери останатите парчиња со мод дали ке се поклопат потоа пак одзема од истото парче доколку може наравно ако не иде на наредното одзема и проверува со мод за да се намали сложеноста програмата за мод нема да мора да иде од првото парче туку за i-то парче ке почне од i+1 парче (i=1,2,3,4....)

со овој проширен алгоритам :) е решен и тој проблем
:)
 

Alexandar

Gaining Experience
21 мај 2007
2,514
90
Доколку Text1, Text2 i Text3 се integer променливи каде ги чуваш должините на парчињата, кодот во Visual Basic би изгледал вака:

Код:
Private Sub Command1_Click()

 For i = 0 To (600 / Text1)
   For j = 0 To (600 / Text2)
     For k = 0 To (600 / Text3)
       If (i*Text1 + j*Text2 + k*Text3) = 600 Then
         Message.Show(i + " parcinja od dolzina " + Text1 + "   " + 
                              j + " parcinja od dolzina " + Text2 + "   " + 
                              k + " parcinja od dolzina " + Text3 + " pravat 600 cm") 
       End If
     Next k
   Next j
 Next i
End Sub
Во C++ би изгледал вака:

Код:
for(int i=0;i<=(600/Text1);i++)
  for(int j=0;j<=(600/Text2);j++)
    for(int k=0;k<=(600/Text3);k++)
      if(i*Text1 + j*Text2 + k*Text3 == 600)
        cout << i << " parcinja so dolzina " << Text1 << "t"
               << j << " parcinja so dolzina " << Text2 << "t"
               << k << " parcinja so dolzina " << Text3 << endl;
Во Pascal би изгледал вака:

Код:
 For i := 0 to trunc(600 div Text1) do
   For j := 0 To trunc(600 div Text2) do
     For k := 0 To trunc(600 div Text3) do
       If (i*Text1 + j*Text2 + k*Text3) = 600 Then
         writeln(i, " parcinja so dolzina ", Text1, " ",
                   j, " parcinja so dolzina ", Text2, " ",
                   k, " parcinja so dolzina ", Text3);
Со овој алгоритам ќе ти ги даде сите можни комбинации, односно сите комбинации со кои од овие вредности може да се состави бројот 600 и ќе ти ги испише на екран. Со алгоритмот на MetalGear ќе даде само една комбинација која некогаш може да даде точен резултат, односно 600, а некогаш ќе има и остаток. Кој алгоритам според тебе повеќе ти врши работа тој користи го.
 

MetalGear

On your way to fame
14 април 2007
2,997
510
www.ibiz.mk
да aleksandar е во право
и 2та имаат предности и мани

мојот работи за неограничен број на парчиња е сеа ти дава само по една комбинација т.е. она со која ке имаш најмал остаток со мод опцијата е решен и друг проблем т.е. доколку има некои парчиња кои се деливи со остатокот на шипката

алгоритмот и програмата на aleksandar е добра доколку унапред го знаеш колку парчиња треба да имаш за да знаеш колку фор циклуси да ставиш

можеш на страна да си поставиш ratiobox и од која опција е чекирана тој код да се избршува т.е. толку вгнездени фор циклуси да има и е добра за помал број на парчиња
што ако имаш 100 парчиња :)

и двата методи ти се добро објаснети
останува на тебе да го избереш оној кој највеќе ке ти одговара :)

позз
 
  • Ја почнал/а темата
  • #14

fuUuUzZzZy

On your way to fame
14 декември 2007
4,842
885
Ohrid
Вака.. Ги сфатив двата алгоритми..
Од Александар успеав и да го направам со една измена што не се става "+" туку треба "&"
на пример:
Код:
Private Sub Command1_Click()

 For i = 0 To (600 / Val(Text1))
   For j = 0 To (600 / Val(Text2))
     For k = 0 To (600 / Val(Text3))
       If (i * Val(Text1) + j * Val(Text2) + k * Val(Text3)) = 600 Then
         Text4.Text = (i & " parcinja od dolzina " & Val(Text1) & "   " & j & " parcinja od dolzina " & Val(Text2) & "   " & k & " parcinja od dolzina " & Val(Text3) & " pravat 600 cm")
       End If
     Next k
   Next j
 Next i
End Sub
Алгоритмот е супер, само мислам дека не е правата идеа..
На пример доколку трите променливи се: 450, 100 и 50 ќе добијам резултат:
1 parcinja od dolzina 450 1 parce od dolzina 100 1 parcinja od dolzina 50 pravat 600 cm
И тука ќе биде во ред, но ако на пример променливите се: 300, 280 и 210 резултатот ќе биде:
2 parcinja od dolzina 300 0 parcinja od dolzina 280 0 parcinja od dolzina 210 pravat 600 cm
а јас немам 2 парчиња од 300, туку имам само едно од 300 ..
А на пример правилно треба да се искористи од сите по едно со што би останале само 10 цм вишок..
Ова е само пример за со 3 променливи.. А додека пак со 6 или 7 би бил тотален хаос.. Со повеќе променливи програмата би ги користела само првите неколку парчиња додека ја оствари целта т.е додека достигне до 600 .. Но како што кажав, мене ми треба да ги користи сите само по еднаш, притоа нормално и да одземе од некоја шипка по некој сантиметар но тоа да биде најмалку што е можно..
Значи како што напоменав уште во првиот пост, проблемов ми е од 6 или 7 променливи на пример да искомбинира величина составена од тие 6 искористувајќи ги само еднаш и притоа да има најмал остаток..

А додека пак од MetalGear мислам дека е правилниот метод само ќе имам проблеми при правањето..
Имам некоја идеа да биде на пример
if 600 - a > b then
ostatok.text = 600 -a -b
else
ostatok.text = 600 -a -c

if 600 -a -b > c
ostatok.text = 600 -a -b -c
else
ostatok.text = 600 - a -b - d
ect ect..

Тука како и што кажавте не е точно во сите ситуации но во повеќето ќе биде па така да тоа ќе ми биде доволно.. Е сега дали ќе успеам по оваа логика да го направам иако сумљам, но тоа е друго..
Крај краева можам да ставам уште некој услов како што кажавте но тоа потака :)
 
  • Ја почнал/а темата
  • #15

fuUuUzZzZy

On your way to fame
14 декември 2007
4,842
885
Ohrid
Вака.. Ги сфатив двата алгоритми..
Од Александар успеав и да го направам со една измена што не се става "+" туку треба "&"
на пример:
Код:
Private Sub Command1_Click()

 For i = 0 To (600 / Val(Text1))
   For j = 0 To (600 / Val(Text2))
     For k = 0 To (600 / Val(Text3))
       If (i * Val(Text1) + j * Val(Text2) + k * Val(Text3)) = 600 Then
         Text4.Text = (i & " parcinja od dolzina " & Val(Text1) & "   " & j & " parcinja od dolzina " & Val(Text2) & "   " & k & " parcinja od dolzina " & Val(Text3) & " pravat 600 cm")
       End If
     Next k
   Next j
 Next i
End Sub
Алгоритмот е супер, само мислам дека не е правата идеа..
На пример доколку трите променливи се: 450, 100 и 50 ќе добијам резултат:
1 parcinja od dolzina 450 1 parce od dolzina 100 1 parcinja od dolzina 50 pravat 600 cm
И тука ќе биде во ред, но ако на пример променливите се: 300, 280 и 210 резултатот ќе биде:
2 parcinja od dolzina 300 0 parcinja od dolzina 280 0 parcinja od dolzina 210 pravat 600 cm
а јас немам 2 парчиња од 300, туку имам само едно од 300 ..
А на пример правилно треба да се искористи од сите по едно со што би останале само 10 цм вишок..
Ова е само пример за со 3 променливи.. А додека пак со 6 или 7 би бил тотален хаос.. Со повеќе променливи програмата би ги користела само првите неколку парчиња додека ја оствари целта т.е додека достигне до 600 ..
Но како што кажав, мене ми треба да ги користи сите само по еднаш, притоа нормално и да одземе од некоја шипка по некој сантиметар но тоа да биде најмалку што е можно..


А додека пак од @MetalGear мислам дека е правилниот метод само ќе имам проблеми при правањето..
Имам некоја идеа да биде на пример
if 600 - a > b then
ostatok.text = 600 -a -b
else
ostatok.text = 600 -a -c

if 600 -a -b > c
ostatok.text = 600 -a -b -c
else
ostatok.text = 600 - a -b - d
ect ect..

Тука како и што кажавте не е точно во сите ситуации но во повеќето ќе биде па така да тоа ќе ми биде доволно.. Е сега дали ќе успеам по оваа логика да го направам иако сумљам, но тоа е друго..
Крај краева можам да ставам уште некој услов како што кажавте но тоа потака :)
 

vik

Intern
14 април 2007
1,936
31
Јас мислам дека , ако го користис алгоритмот на MetalGear подобро ке е должините на парчињата да ги ставиш во array и со еден циклус да го листаш без да се зафркаваш едно по едно да ги пошиш како прменливи.
 

MetalGear

On your way to fame
14 април 2007
2,997
510
www.ibiz.mk
епа доколку ти треба по едно од сите тогаш е уште полесно
ја сортираш низата од парчињата во еднодимензионална матрица
и само со еден for ciklus ке ги листаш парчињата и одземаш од шипката ке ти напишам код во ц++ но директно тука немам компајлер :D



откако ке ја сортираш низата во опаѓачки редослед ке ти биде во матрицата а со должина n a prvo член да е 1
должина на шипка нека ти е dol_s
a во матрица parce колку парчиња има од која големина stavi gi site vrednosti na matricata parce 0


for(a=0; a<5;a++) ke e samo da ja projde matricata uste nekolku pati vo slucaj dokolku ja prosla samo ednasa ima ostatok pogolem na primer od nekoe parce da go iskoristi

Код:
for(a=0; a<5;a++) 
{
   for(i=1; i<=n; i++)
      if(a[i]<=dol_s)
      {
         dol_s=dol_s-a[i]
         parce[i]++
      }
}    

for(i=1; i<=n; i++)
cout<<"imame "<<parce[i]<<" del od paece so dolzina "<<a[i]<<endl;
ете тоа е основниот код на алгоритмот
е доколку сакаш да провери и со мод
i poraboti na izlezot
 

Nikol4e

Intern
12 јануари 2008
72
2
Eve i jas uspeav nabrzinski da napisam nesto -> klikni ovde

Mozes da dodavas kolku sakas sipki ( edna sipka e koristi poveke pati ). Ednostavno sekoj broj oznacuva nekoja kombinacija od spiki, pa samo ja napraviv funkcijata na koja i davas broj a taa ti generira soodvetna kombinacija. Potoa gi prevrtuvas kombinaciite kako ednodimenzionalno pole i baras koja ti odgovara ... :)

Nekako sporo rabotese dokolku imas vneseno poveke sipki, pa zatoa improvizirav progresbar.

P.S. fuUuUzZzZy ne te razbrav dali moze da se upotrebuva edna sipka poveke pati, pa zatoa go napraviv edna sipka da ja koristi onolku pati kolku sto mu treba. Dokolku treba samo ednas ( ili tocno odreden broj pati ) da se koristi nekoja sipka, pisi pa ke probam da naprav takvo nesto.
poz
 
  • Ја почнал/а темата
  • #19

fuUuUzZzZy

On your way to fame
14 декември 2007
4,842
885
Ohrid
хмммз.. Фала што се обиде, но некако не ја рабирам работава на програмава :))

Имаш "шипки на лагер" што мене не ми е потребно т.е пресметката треба да се врши само со една шипка , потоа гледам еден text box но што и да внесиш таму, т.е кога и да одиш "состави" се појавува error и го обележува овој дел:
kombinacii(k) = kombinacii(k) + List1.List(b(i))
Ќе го разгледам подетало кодот па ќе видам што ти е намерата..

Инаку,
P.S. fuUuUzZzZy ne te razbrav dali moze da se upotrebuva edna sipka poveke pati, pa zatoa go napraviv edna sipka da ja koristi onolku pati kolku sto mu treba. Dokolku treba samo ednas ( ili tocno odreden broj pati ) da se koristi nekoja sipka, pisi pa ke probam da naprav takvo nesto.
poz
Вака.. Фактички целава работа е околу остатокот на само една шипка од 600 цм ( 6 м ).
Јас имам на пример пресечени парчиња од 150 цм, 220 , 140 , 60, 80 , 100 и сл. т.е тоа се променливи.

И сега програмата според моја замисла треба да состави комбинации од сите променливи и тоа користејќи ги само по еднаш, се со цел да се добие број најблиску до 600 ( 6 м ).

На пример во случајот со горенаведените променливи ( 150 , 220 , 140 , 60, 80 , 100 ) програмата би требало да состави комбинации како:

150 + 220 + 140 + 80 = 590 ;
150 + 220 + 140 + 60 = 570
50 , 220 , 140 , 60 = 570

И од овие 3 комбинации да ја испише таа што е најблиску до 600, во случајов 150 + 220 + 140 + 80 = 590

Доколку нешто не е јасно прашајте.

Btw. Јас се обидувам според алгоритмот од MetalGear но без тоа мод, туку чисто сортирани по опаѓачки редослед, и едноставно да ги одзема по ред од најголемото па надолу, и доколку некое парче е поголемо од остатокот, едноставно тоа парче да се прескокни и да си продолжи со следното..

на пример со истите променливи ( 150 , 220 , 140 , 60, 80 , 100 ) би требало да е:
1. Прво ги внесувам по опаѓачки редослед - 220 ; 150 ; 140 ; 100 ; 80 ; 60
2. Програмата почнува да одзема од првиот па надолу, и во случај доколку некое парче е поголемо од остатокот да го прескокне и да премине на следното
на пример:

600 - 220 = 380
380 - 150 = 230
230 - 140 = 90
90 - 100 = x - парчето е поголемо од остатокот па одземањето продолжува со следното парче
90 - 80 = 10
10 - 60 = парчето е поголемо од остатокот па одземањето продолжува со следното парче

Значи остатокот е 10 цм.

Од прилика вака тоа изгледа на почетокот:

Private Sub Command1_Click()

If 600 >= Val(a) Then
ostatok.Text = 600 - Val(a)
Else
ostatok.Text = 600 - Val(s)
End If

If 600 >= Val(a) - Val(s) Then
ostatok.Text = 600 - Val(a) - Val(s)
Else
ostatok.Text = 600 - Val(a) - Val(d)
End If
Со внесување повеќе услови би требало да успеам..

Единствено што ми прави проблем со овој метод е кога ќе се одземаат остатокот и парчето, доколку парчето е поголемо од шипката, не го прескокнува, туку одземањето си продолжува и резултатот на крај ми испаѓа негативен :))

На пример :
90 - 100 = -10
-10 - 60 = -70

остатокот е -80. :))

Тоа се обидувам да го поправам..
 

MetalGear

On your way to fame
14 април 2007
2,997
510
www.ibiz.mk
па затоа ке ставиш услов да ги прескокнува парчињата кои се поголеми од остатокот на шипката

If 600 >= Val(a) Then
ostatok.Text = 600 - Val(a)
Else
ostatok.Text = 600 - Val(s)
End If


If 600 >= Val(a) - Val(s) Then
ostatok.Text = 600 - Val(a) - Val(s)
Else
ostatok.Text = 600 - Val(a) - Val(d)
End If


else tuka ne ti treba затоа ги ги одзема и поголемите шипки
кодот како би требало да излезе стварно не знам скоро сум ја заборавил синтаксата во visual basic

толку тоа е и идејата на алгоритмот со сортирање на парчињата и одземање почнувајќи од најголемото
на тој начин ке имаш најмал остаток секогаш има и други можности но според мене ова ти е најлесна и најотпимизирана за таа намена
 

Alexandar

Gaining Experience
21 мај 2007
2,514
90
@fuUuUzZzZy

Сфатив што сакаш. Имаш неколку шипки од различна големина. Сакаш тие шипки да ги искористиш за да составиш една поголема која ќе биде еднакво или најблиска до бараната.

Алгоритам:
треба да ги провериш сите бинарни комбинации за шипките, да видиш која е најблиска до бараната и да ја испечатиш, односно за 3 шипки треба да ги провериш сите бинарни комбинации. Такви комбинации има 2 на n-ти степен, во случајов 8, а тие се:
000
001
010
011
100
101
110
111

Секоја цифра означува дали шипката со редниот број каде е единицата ќе учествува во создавањето на крајната или нема да учествува. Ти треба да ги поминеш сите тие комбинации и да провериш која комбинација е соодветна. Притоа да ги испечатиш редните броеви на шипките кои учествуваат во создавањето на крајната.

Бидејќи на компјутеров на кој моментално работам имам само Pascal, го напишав кодот во Pascal:

Код:
program fuzy;
uses crt;
var
  dolzina, broj, i, j, k, temp, rez:integer;
  kratki, mnoz:array[1..100] of integer;
  koristeni, tmp: string;
begin
clrscr;
writeln('Vnesete ja dolzinata na cevkata koja treba da se dobie: ');
readln(dolzina);
writeln('Vnesete kolku mali cevki imate: ');
readln(broj);
for i:=1 to broj do
  begin
  writeln('Vnesete ja dolzinata za malata cevka so reden broj ', i, ' :');
  readln(kratki[i]);
  mnoz[i]:=0;
  end;
mnoz[1]:=1;
mnoz[broj+1]:=0;
rez:=0;
koristeni:='';
while(mnoz[broj+1]<=1) do
  begin
  temp:=0;
  for i:=1 to broj do
    begin
    temp:=temp+kratki[i]*mnoz[i];
    end;
  if (temp > rez) and (temp <= dolzina) then
    begin
    rez:=temp;
    koristeni:='';
    for i:=1 to broj do
      if mnoz[i]=1 then
	begin
	str(i, tmp);
	koristeni:=koristeni + '   ' + tmp;
	end;
    end;
  mnoz[1]:=mnoz[1]+1;
  for i:=1 to broj do
    if mnoz[i]>1 then
      begin
      mnoz[i]:=0;
      mnoz[i+1]:=mnoz[i+1] + 1;
      end;
  end;
  writeln(' ');
  writeln('Treba da se iskoristat cevkite so redni broevi: ');
  writeln(koristeni);
  readkey;
end.
Кодот е едноставен така да мислам дека нема да имаш проблеми да го преведеш во VB.

А претходното мое решение не е за овој проблем, но не сме се разбрале најдобро :)
 
  • Ја почнал/а темата
  • #24

fuUuUzZzZy

On your way to fame
14 декември 2007
4,842
885
Ohrid
Yeaaaaaaaaaaaaaaaaaa :))
Фала ти многу Николче. Точно тоа ми беше замислата..
No Comment.. Ми ги скрати маките..
Omg..
Фала и на aleksandar и MetalGear.. Почнав да правам и по вашите алгоритми, ама веќе е решено :)

Фала ви уште еднаш на сите. :bravo:
 

Нови мислења

Последни Теми

Статистика

Теми
43,568
Мислења
823,581
Членови
28,075
Најнов член
GGPPkorcula
На врв Дно