به شما n عدد a1 تا an داده شده است، شما باید زیرمجموعه ای از آن را بیابید که اعداد هیچ زیرمجموعهی ناتهی آن برابر با 0 نشود و جمع اعداد آن بیشینه باشد.
در سطر اول ورودی عدد 1≤n≤100 آمده است، در سطر بعدی n عدد a1 تا an آمده است.
در تنها سطر خروجی اعداد زیر مجموعه را به ترتیب صعودی چاپ نمایید. در صورتی که چند جواب برای سؤال وجود دارد، یکی از آنها را چاپ نمایید.
ورودي نمونه | خروجي نمونه |
---|---|
3 1 2 3 | 2 3 |
پاسخ
ابتدا توجه کنید که اگر یک مجموعه از اعداد هیچ زیر مجموعهی ناتهی نداشته باشد که XOR اعضای آن صفر شود، معادل این است که هیچ یک از اعضای آن را نتوان برحسب XOR بقیهی اعضا نوشت. چون اگر یک عضو را بتوان برحسب بقیهی اعضا نوشت XOR این عضو با بقیهی اعضا صفر میشود. اگر هم XOR یک زیر مجموعه صفر شد XOR هر یک از اعضا باید برابر با XOR بقیه شود.
برای حل این مسئله از الگریتم حریصانه استفاده میکنیم. یعنی اعداد را ابتدا به ترتیب نزولی مرتب میکنیم. سپس به ترتیب اعداد را پیمایش میکنیم و هر عددی که اجتماعش با اعداد انتخاب شدهی قبلی تولید زیرمجموعهای نمیکرد که XOR آن صفر شود را انتخاب میکنیم. فرض کنید در این الگریتم اعداد x1 تا xkانتخاب شده باشند. (که اینها به ترتیب نزولی هستند) اگر این مجموعه تشکیل یک جواب بهینه بدهند که مسئله حل است. در غیر این صورت یک جواب بهینه به صورت y1 تا y′k در نظر بگیرید. i را کوچکترین اندیس بگیرید که xi≠yi است. مطمئنا هیچ یک از y1 تا y′k ها نباید مساوی با xi باشند و چون y1 تا y′k تشکیل یک جواب بهینه میدهند پس اجتماع آنها با xi یک زیرمجموعه دارد که XOR اعضایش صفر هستند. xi باید عضو این زیرمجوعه باشد. پس xi را میتوان برحسب XOR y1 تا yk′ نوشت. فرض کنید این اعضا z1 تا zm باشند. پس داریم: xi=z1⊕⋯⊕zm همهی z1 تا zm ها نمیتوانند از xi بزرگتر باشند چون با توجه به اینکه اعضای بزرگتر از xi در x1 تا xk با y1 تا y′k برابرند در این صورت زیر مجموعهی x1 تا xi−1 میشوند. پس zj موجود است که zj<xiحالا اگر در مجموعهی y1 تا y′k به جای zj ،xi را بگذاریم ادعا میکنیم که هنوز زیرمجموعهای وجود ندارد که XOR آن صفر شود.
فرض کنید این اتفاق بیافتد. در این صورت این زیرمجموعه باید شامل xi باشد پس xi را میتوان برحسب اعضای y1 تا y′k نوشت. از طرفی xi برابر با XOR z1 تا zm میشد. حالا اگر XOR این دو زیرمجموعه را برابر قرار دهیم یک زیرمجموعه بهدست میآید که XOR آن صفراست(با توجه به اینکه zj در یک طرف آمده و در طرف دیگری نیامده است) XOR آن صفر شود.
پس درستی الگریتم ثابت شد. در مورد زمان اجرای این الگریتم کافی است نشان دهیم بررسی کردن اینکه یک عدد را میتوان برحسب XOR اعضای یک مجموعه نوشت در زمان خوب امکانپذیر است. متغییر دودویی siرا این طور تعریف میکنیم که آیاازعضو iام این مجموعه استفاده میکنیم یا نه. در این صورت به ازای هر بیت از عددمان به یک معادله می رسیم. اگر فرض کنیم بیت مورد نظر در عدد j ام bj باشد. و در عدد اصلی مان h باشد آنگاه باید داشته باشیم: s1×b1+⋯+sr×br=h پس ما به یک دستگاه معادلات می رسیم که باید آنرا حل کنیم و ببینیم آیا جوابی دارد یا نه.(این دستگاه در مبنای 2 است و باید ضرب و جمع این مبنا را در نظر گرفت) این کار هم در زمان O(r2n) امکانپذیر است. که r تعداد بیتها است. پس چون ما به ازای هر عدد یک دستگاه معادلات حل میکنیم در کل زمان اجرا O(r2×n2) است. که با توجه به اینکه n<100 این الگوریتم بهینه است.