Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

sparrowbg avatar sparrowbg 4 Точки

[Homework] Advanced C# - Arrays, Lists, Stacks, Queues - Решение на задача 6

Здравейте колеги,

 

Предоставям решение на задача номер 6. Според мен не е най-оптималното защото е сглобено набързо, но ще ми е изключително любопитно да видя и други решения на тази задача.

http://pastebin.com/FpWULcat

Тагове:
2
Fundamentals Module
Gabbs avatar Gabbs 80 Точки

И аз го направих по същия начин, просто разписано по-различно:

http://pastebin.com/3Wyq6iNc

:)

1
17/09/2015 02:08:22
l.s.bozhinov avatar l.s.bozhinov 1 Точки

Аз по малко по-различен. Моето решение може да намерите тук.

0
Rextor92 avatar Rextor92 149 Точки

Ето го и моето решение в github.com/rextor92 . Задача 7 става с много малки промени и добавянето на 3 реда, и тя е в repository-то :)

1
stefkay avatar stefkay 54 Точки

Здравей, 

Някой беше коментрирал във форума по повод задачи 6 и 7, че е по-добре броят на комбинациите да се изнесе в променлива, иначе се смята при всяко завъртане на цикъла. 

int combinations = (int)Math.Pow(2, arr.Length);

Отделно по-оптимизирано било да се напишe: 

int combinations = 1 << arr.Length;

Иначе решението ти е супер кратко, аз съм се оляла.

6. SubsetSums

 

2
18/09/2015 13:19:15
vanndann avatar vanndann 1 Точки

Може ли да обясниш какво правиш с if ((mask >> bit & 1) == 1)? Неразбирам, защо това условие добавя членове  в листа от комбинации?

0
cap7ainjack avatar cap7ainjack 20 Точки

Много хитро решение! 1+

0
tilchev92 avatar tilchev92 Trainer 128 Точки

Много готино, само че има проблем при извеждането на "No matching subsets.", защото subsets.Sum() по подразбиране е 0 и ти извежда " = 0" вместо "No matching subsets."

Ето моето решение на 7ма, по твоя код, с fix за това и някой други оптимизации :)

0
sparrowbg avatar sparrowbg 4 Точки

За всяка комбинация, проверявам на местата където са 1 битовете,  събирам числата. Това го постигам по следният начин. Вземам комбинацията която е Н-на брой числа, подавам я на метода, който върти числата в нея и в същощо време проверя маската(то това е по важното тук) дали текущият бит е 1, ако не е това число не е част от комбинацията и минава на следващото като преди да мине на селдващото число шифвам маската с 1 позиция на дасно защото монаваме на следващото число от комбинацията.. И така цялата комбинация. Имам грешка която е по-скоро от недоглеждане, тоест зараввил съм да махна код който използах за дебъг и това може да обърка ората които гледат код-а. Разбира се, че не трябва да е така , но вече го бях публикувал и самото домашно...

 

0
kidroca avatar kidroca 117 Точки

Здравейте,

Ако искате кода ви да изглежда по - готино (оцветен) в pastebin, избирайте от менюто Syntax Highlighting: C# (или на какъвто език сте писали)

Hint

1
20/09/2015 13:23:29
Fujitzo avatar Fujitzo 9 Точки

Здравейте всички,

@l.s.bozhinov - доста мастър решение, но ми се струва че е далеч над нивото, на което сме повечето, които сме се захванали с програмиране преди 2 месеца :)

@nikolaykk и @Rextor92 - гласувам за вашите решения - най-прости и разбираеми ми се струват

Исках да кажа няколко думи за намирането на комбинациите с побитови операции, понеже това е ключовото в случая. Явно е заучено положение, просто аз не съм попадал на такава задача до сега. Ще го разпиша малко по-подробно, може пък и да спестя 2ч лутане на някой като мен, който си няма идея първоначално. Взимам за пример начина на nikolaykk:

  1.   for(int mask =0; mask<combinations;mask++)

  2.         {

  3.             for (int j=0;j<input.Length;j++)

  4.             {

  5.                 if ((mask & (1<<j)) != 0)

  6.                 {

  7.                     subset.Add(input[j]);                  

Маската е поредната комбинация, а j е поредната позиция от редицата която е подадена първоначално. Правим побитово "и" на всички комбинации м/у mask и 1 изместено j пъти наляво. И така за mask = 0 , ще получим само нули, затова директно отиваме на mask = 1, имаме:

1 & 1 = 1 , 1 & 10 (1цата изместена 1 път) = 0 , 1 & 100 = 0 и т.н - т.е от това завъртане на вътрешния цикъл в subset ще влезе само първия член на редицата и това е комбинация номер1

Да вземем например 3тата поред комбинация - mask = 3 (двоично 11) , имаме:

11 & 1 = 1 , 11 & 10 = 10, 11 &100 = 0 и натам са все нули. Тук в текущия subset ще влязат 1вото и 2рото число от редицата.

Ако вземем 55тата комбинация mask = 55 = 110111

110111 & 1 = 1, 110111 & 10 = 10, 110111 & 100 = 100, 110111 & 1000 = 0, 110111 & 10000 = 10000, 110111 & 100000 = 100000 , натам са нули. Това ще вземе 1вото, 2рото, 3тото, 5тото и 6тото число

И така в subset ще получим всички възможни комбинации от числата в редицата. Доста гениално според мен, никога нямаше да стигна сам.

Това е от мен

3
vaseto_v avatar vaseto_v 50 Точки

Това подробно обяснение за намирането на комбинациите много ми помогна!

Благодаря!

Искам да попитам само за намирането на броя комбинации ако може подробно някой да ми поясни

int combinations = (int)Math.Pow(2, arrayOfNumbers.Length);

Защо и как определяме, че точно това ще е броят им?

0
Fujitzo avatar Fujitzo 9 Точки

Предполагам отговора се крие във формулата за намиране броя комбинации - https://bg.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B0%D1%82%D0%BE%D1%80%D0%B8%D0%BA%D0%B0

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.