![]() |
Програмка отбора множеств
Ребята,помогите пожалуйсто написать такую програмку на любом языке:
Даны 25 букв: A,B,C,D,E,F,G,H,I,K,L,M,N,O,P,Q,R,S,T,U,V,W,Y,J,Z и 21 переменная, которым присвoены следующие наборы букв X1 = {A,B,C,D,E,F,G,H,I,K} X2 = {L,M,N,O,P} X3 = {Q,R,S,T,U,V,W,Y,J,Z} X4 = {A,B,L,M,Q,R} X5 = {C,D,E,F,G,H,I,K,N,O,P,S,T,U,V,W,Y,J,Z} X6 = {A,L,Q} X7 = {B,M,R} X8 = {L,Q,R,T,W} X9 = {A,M,S,U,Y} X10= {B,C,N,V,J} X11= {D,E,F,G,H,I,K,O,P,Z} X12= {A,B,D,G,L} X13= {C,E,H,M,Q} X14= {F,I,N,R,S} X15= {K,O,P,T,U,V,W,Y,J,Z} X16= {L} X17= {A,Q} X18= {B,M,R} X19= {C,D,S,T} X20= {E,G,N,U,W} X21= {F,H,I,K,O,P,V,Y,J,Z} 1)Необходимо отобрать все комбинации из переменных(ограничим количество иксов в одной комбинации до 10), которые содержат все заданные буквы(буквы могут повторяться). Например Х1,Х2 и Х3 содержат все буквы, или Х2,Х17,Х18,Х19,Х20 и Х21( в этом случае буквы повторяются, но это допустимо) 2)Теперь каждой из Х присваивается какое либо число(1<n<10), и нужно оставить только те из отобраных комбинаций, которые удовлетворяют неравенству 1/Х1 + 1/Х2 +,...,+ 1/Хn < 1, где Х1,Х2,..,Хn - переменные в 1) отобраных комбинаций. например: Х1=2, Х2=3, Х3=4, Х17=10, Х18=7, Х18=20, Х19=8, Х20=15, Х21=6 смотрим: 1/2 + 1/3 +1/4 = 1.0833 => не подходит,(Х1,Х2,Х3) 1/3 + 1/10 + 1/7 + 1/8 + 1/15 + 1/6 = 0.93 => подходит(Х2,Х17,Х18,Х19,Х20,Х21) Должно получиться так, чтобы я задавал значения всех иксов, а программа выдавала мне все подходящие комбинации. |
Alexk1984, простите, а в чем собственно ваша проблема в этой задаче?
|
Trotil, в том что я не программирую, но мне очень нужна эта программка, и не к кому обратиться,
поэтому я и прошу помощи, можно узнать, насколько сложно и обширно решение этой задачки? |
Цитата:
Цитата:
Цитата:
|
Хорошо, я понимаю
Я пытался начинать писать её в паскале, но с самого начала загвоздка, как сформировать все возможные комбинации из иксов(мах.десятизначные)? |
Так. Мысли такие: (есть привычка делать код универсальным,а создание 21 переменной и, например 10 влояженных циклов - кажется дикостью...), поэтому:
1) загоним 21 переменную в множество-массив: Код:
Код:
maxset = ['A','B','C', ..., 'Z'];Цитата:
Но есть способ проще, хотя он будет работать значительно дольше (много лишних комбинаций). Основная идея - комбинацию будем представлять обычным целым числом, где i-тый бит будет означать отстутствие/присутствие i-той переменной в комбинации: пример: 10 = (1010) в двоичном виде - означает комсбинацию, в которую входит 2-ая и 4-ая переменная в цикле от 1 до (2^21-1) мы должны послать эту переменную (i) в процедуру, которая: 1) посчитает количество единиц в двоичном наборе (гаденькое ограничение на 10 переменных в комбинации) - см. функцию внизу. 2) если проходит проверку, то Код:
(charsetarray [1*((2^0 and i) shr 0)] + 2^k and i - побитовое умножение i и k-того бита - возвращает 0, если нет k - того бита в множеств, а charsetarray[0] - это у нас пустое множество, ни на что не влияющее. В случае совпадения там будет возвращено 2^k, в то время как там нужно получить в качестве индекса целое число k. Для этого происходит сдвиг на k разрядов вправо, в результате чего (k+1)-тая единица сдвинется на (k) разряд вправо и выражение станет равным единице, a k*1=k, что и требовалось получить. И наконец, простая функция подсчета единиц в двоичном представлении числа i: Код:
function func (m:longint) : integer;Цитата:
|
а когда мы указывали charsetarray = array [1..21] of charset;, следует внести 0 или оно и так определит его как пустое множество?
|
В общем получилось такое):
Код:
type charset = set of 'A''B''C''D''E''F''G''H''I''K''L''M''N''O''P''Q''R''S''T''U''V''W''Y''J''Z';Извините за назойливость, но это действительно моя первая программа ( точнее ваша)). |
Мама - мия.. Только вот не надо было все тупо копировать, тот код, который я привел - это примерно треть программы... Мдя...
Потом местами - это не совсеи по правилам Паскаля написано, что впрочем легко исправляется... Предпологалось, что хоть некоторые сведения о программировании у вас имеются.. |
Извините меня, но за два часа я ещё не научился "умно" копировать, на счёт трети программы, так я понял что это только алгоритм отбора всех подмножеств, но надо же как то проверять работает ли на самом деле та или иная часть программы.
Ну теперь уже что-то имеется..)) можно вопросик, Вы составите её теперь полностью или мне продолжать самостоятельно освоение Паскаля)? |
Задачка решена, спасибо всем са помощь!!
|
| Часовой пояс GMT +4, время: 12:34. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.