PDA

View Full Version : لطفا در نوشتن برنامه زیر به من کمک کنید:



mehdi_moosavi
دوشنبه 19 بهمن 1383, 19:19 عصر
سلام
لطفا در نوشتن برنامه زیر به من کمک کنید:

برنامه ای بنویسید که پس از گرفتن چند عدد ، چند تا از آنها را طوری انتخاب کند که حاصل جمع آنها بزرگترین عدد کوچکتر از یک عدد ثابت باشد با توجه به اینکه:

- تعداد اعدادی که وارد میشود ازقبل مشخص نیست.
- تعداد اعداد انتخاب شده حداقل 1 و حداکثر به تعداد تمام اعداد وارد شده است.

alidll
سه شنبه 20 بهمن 1383, 09:10 صبح
با عرض سلام به دوستان
یک راهی که به نظر من رسید اینه :
ابتدا اعداد وارد شده را در یک آرایه می ریزی : n1,n2,n3,n4,n5 و الی آخر .و عدد ثابت هم مثلا C.
سپس n1+n2 = I اگه I (حاصل )کوچکتر از C بود :I+n3=I1 وگرنه n1وn2 و I را در یک جایی ذخیره می کنی و دوباره ادامه می دی اینبار n1+n3 = I اگر I کوچکتر از C بود : I+n4=I1 ........
البته هر بار که حاصل را می خواهی ذخیره کنی باید یک چک را انجام بدی که مقدار I آیا یک واحد از C کمتر است یا نه مثلا آیا I=14 است و C=15 اونوقت دیگه کار تموه مگر اینکه اعداد اعشاری باشن که اون وقت باید عملیات تا انتها ادامه پیدا کنه تا بتونی اعدادی که حاصل جمعشون بزرگتر از کوچکتر از عدد ثابت باشه پیدا کنی.
موفق باشی :موفق:

سه شنبه 20 بهمن 1383, 13:34 عصر
یک راهی به ذهن من در حال حاضر میرسه اینه که یک درخت بوجود آوری . بدین صورت که ریشه درخت که هیچی ( مثلا صفر ) ولی این نود به تعداد عدد های ورودی ات شاخه داره که مقدار هر نود مربوطه اش یکی از اون عدد هاست .
حال باز هر نود n-1 شاخه دارد که مقدارهاش عددها تو غیر از خود عدد نود پدرش .

به همین صورت تمام ترکیبها بوجود می آیند .
حال از توی این درخت بزرگترین عدد کوچکتر از عدد مورد نظرت رو پیدا میکنی . ممکنه این عدد در هر level از درخت تو باشه .
راهش هم اینه که مقدار تمام نود ها رو به غیر از ریشه درخت در یک لیست بریزی و اون عدد رو پیدا کنی که دیگه اینجاش کاری نداره و خودت باید بتونی پیدا کنی من دیگه توضیح نمیدم .

البته بگم این رو من سرسرکی به ذهنم رسید شاید الگوریتمم اشتباه باشه .

:موفق:

mehdi_moosavi
سه شنبه 20 بهمن 1383, 20:52 عصر
سلام
با تشکر از شما
هر دو راه رو بررسی کردم در مورد راه حل اول اشکال اینه که هربار فقط 2 تا از اعداد با هم جمع شده و با عدد ثابت چک میشن در حالی که شاید مثلا اگه 3 تا یا 4 تا از اعداد رو انتخاب کنیم و با هم جمع کنیم حاصلجمع ، بزرگترین عدد کوچکتر از عدد ثابت بشه ضمنا در این روش اعداد به ترتیب از اول تا آخر انتخاب میشن ولی شاید اگه مثلا اعداد دوم و پنجم و نهم رو انتخاب کنیم و با هم جمع کنیم به عدد مورد نظر برسیم
منظورم اینه که چرا باید اول n1 رو انتخاب کنیم و بعد n2 و بعد n3 ؟


در مورد راه حل دوم در واقع فقط ترکیبهای مختلف از محل قرار گرفتن اعداد وارد شده بدست میاد مثلا اگه اعدادمون باشن:

20 - 90 - 120 - 40

در هر شاخه خواهیم داشت:

1- 20-90-120-40
2- 120-90-20-40
3- 90-120-20-40

والی آخر و وقتی که اعداد موجود در هر شاخه رو با هم جمع کنیم حاصل جمع تمام شاخه ها با هم برابر میشه و به جواب صحیح نمیرسیم
البته این چیزی بود که من از راه حل شما متوجه شدم شاید منظور شما چیز دیگه ای باشه
به هر حال من منتظرم تا دوستان راه حل دیگه ای پیشنهاد کنند
با تشکر

MiRHaDi
چهارشنبه 21 بهمن 1383, 00:37 صبح
سلام
عزیزم راهش استفاده از درخت هست !
شما باید یک درخت حرص شده درست کنی . با ریشه صفر و در مرحله بعد همه عنصر ها !
بعد در هر مرحله ! شاخه هایی که از عدد مورد نظرت بزرگتر هستند دیگه کاندید نیستند ! اونا رو کاری نداری اونایی که کوچیکترند رو میای بقیه (غیر از خودش و پدرانش) رو میذاری جزو بچه هاش !
بعد چک میکنی هر کدوم که جمع خودش با پدرانش از اون عدد بیشتر بود حذف میشه و ... ! بزرگ ترین عدد این درخت جواب سوالته
بای

alidll
چهارشنبه 21 بهمن 1383, 08:21 صبح
با عرض سلام به دوستان
ببین پدر جان :(از چپ به راست بخوان)
I=15 J=I-1=14
n1=5 , n2=6 , n3=7 , n4=1 , n5=3 , n6=10 , n7=12
n1+n2=11=C<I And C<>J C+n3=18=C>I then 5,6,C=11 Save
n1+n3=12=C<I C+n4=13=C<I And C<>J n5+C=16=C>I then n1,n3,n4,C=13 >11 Save
...
...
n2+n3=13=C<I C+1=14=C<I And C=J Then Save And Print n1,n2,n3,C=14 Exit
یعنی در نهایت n2,n3,n4 اولین جواب پیدا شده ما است . در نهایت اگر جوابهای دیگر را هم خواستی پیدا
کنی باید این روال را ادامه بدی. منطقش اینه ولی نوشتن برنامه اش ساده است و یکی دوتا حلقه می خواهد.
امیدوارم درست راهنمایی کرده باشم عزیز برادر :موفق:

شنبه 24 بهمن 1383, 12:34 عصر
و وقتی که اعداد موجود در هر شاخه رو با هم جمع کنیم حاصل جمع تمام شاخه ها با هم برابر میشه و به جواب صحیح نمیرسیم

سلام .
قرار نیست فقط کل یک شاخه رو تا آخرش با هم جمع کنی . به ازا هر نود از اون نود تا ریشه رو جمع کنی بریز توی یک آرایه .

و الا آخر

:موفق: