Loading...
sparrowbg avatar sparrowbg 4 Точки

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

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

 

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

http://pastebin.com/FpWULcat

Тагове:
2
Fundamentals Module
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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.