اولین باره که به کاهو میای؟ راهنمای سایت رو حتما بخون!

ورود ثبت‌نام راهنما درباره‌ی کاهو
پرسش‌ها برچسب‌ها کاربر‌ها سوال بپرسید!

آمار پرسش:

  • پرسیده شده: 2014-06-12 10:10:03 -0500
  • مشاهده شده: 994 بار
  • بروز شده: 2014-06-13 13:15:02 -0500

پرسش‌های مشابه:

جزوه‌ی برنامه‌نویسی (داینامیک)

سوال برنامه نویسی : دنباله ای داریم از n عدد

برنامه نویسی پویا چیست و مسائل مهم آن کدامند؟ (قسمت اول)

وبسایت مسابقه‌های برنامه نویسی

یافتن کوتاه ترین دور در گراف ساده

راهنمایی برای برنامه نویسی

کد مساله هشت وزیر با استفاده از الگوریتم ژنتیک

مجموع ارقام ! 100

مرجع فارسی برای الگوریتم های هندسی و 2sat

نظریه اعداد لازم برای المپیاد کامپیوتری ها

نکاتی در مورد نوشتن پاسخ:

در این قسمت می‌تونی به یک پرسش پاسخ بدی. اگه می‌خوای در مورد پرسش بحث و اظهار نظر کنی از قسمت «ثبت نظر» استفاده کن.
پاسخت رو دقیق و کامل بنویس، از عکس استفاده کن و اگه لازمه به منابع (کتاب یا سایت) ارجاع بده.
اگه پرسش یا پاسخ‌ها مفید هستند حتما بهشون رای بده تا پرسش‌ها و پاسخ‌های خوب مشخص بشن.

استفاده از ویرایشگر:

توی قسمت پیش‌نمایش می‌تونی ببینی متنی که نوشتی چجوری روی سایت دیده میشه.
خیلی مهم: برای اینکه به خط بعد بری باید دوتا Enter بزنی.
می‌تونی از تگ‌های معمولی و ساده‌ی html هم استفاده کنی.
با دکمه‌هایی که بالای ویرایش‌گر قرار دارند کلی کار می‌شه کرد. از عکس‌گذاشتن بگیر تا لیست شماره‌دار. حتما امتحان‌شون کن.

علائم ریاضی:

برای نوشتن علائم ریاضی می‌تونی از Mathjax استفاده کنی. راهنمای Mathjax رو از سایت math.stackexchange بخون.
برای نوشتن عبارت ریاضی وسط جمله، اون عبارت رو بین دوتا $ قرار بده.
برای نوشتن عبارت ریاضی تو یه خط جدید اون رو بین دوتا $$ قرار بده.

تعداد راه‌های افراز عدد ۱۰۰ به اعداد کوچکتر از خود

5

می‌دانیم که عدد ۵ را می توانیم به ۶ طریق به صورت جمع اعداد مثبت کوچکتر از خود بنویسیم:

4 + 1

3 + 2

3 + 1 + 1

2 + 2 + 1

2 + 1 + 1 + 1

1 + 1 + 1 + 1 + 1

حال مسئله از شما می‌خواهد که جواب را برای ۱۰۰ پیدا کنید. (سوال ۷۶ پراجکت اولر)

پراجکت افراز-عدد داینامیک بازگشتی برنامه-نویسی
2014-06-12 10:10:03 -0500
ع ر م 357 ● 4 ● 4 ● 14
پاک‌کردن   ویرایش سوال
نظرات

سوال خوبی را انتخاب کردید. 1+

2014-06-12 10:24:20 -0500 المپیادی

سپاسگزارم.

2014-06-12 10:56:57 -0500 ع ر م

پاسخ برابر با 190569291 است. مطالعه ی بیشتر: https://oeis.org/wiki/Partition_function و http://en.wikipedia.org/wiki/Partition_%28number_theory%29 و http://mathworld.wolfram.com/PartitionFunctionP.html

2014-06-12 11:18:12 -0500 المپیادی

ممنون،‌فقط اگه کد زدید براش خوشحال میشم که تو پاسخ قرار بدید.

2014-06-12 11:22:13 -0500 ع ر م

@ع م ر: بزرگوار، اگر زبان ++c می دانستم، یقینا این کار را انجام می دادم.

2014-06-12 11:33:33 -0500 المپیادی

2 پاسخ

6

$dp[n][k] $ رو تعریف میکنیم تعداد راه های نوشتن تعدادی عدد طبیعی که جمعشون برابر با $n$ بشه و هیچ یک از این اعداد از $k$ بزرگتر نیستن.

حالا اگه تو این اعداد $k$ نیومده باشه که جواب میشه همون $dp[n][k-1]$ اگه $k$ اومده باشه میشه $dp[n-k][k]$

پس در نظر میگیریم: $dp[0][1] = 1$ و $dp[i][j] = dp[i][j-1] + dp[i-j][j]$

جواب هم برابر با $dp[100][99]$ هستش

2014-06-12 11:42:03 -0500
کیانوش 735 ● 2 ● 13
پاک‌کردن   ویرایش پاسخ
نظرات

ممنون، با اینکه من خودم با داینامیک حل کردم ولی الآن به دنبال رابطه بازگشتی با یه آرگومان هستم. هست همچین رابطه‌ای آیا؟

2014-06-12 12:01:17 -0500 ع ر م
4

بله یک بعدیش با توجه به اعداد 5 ضلعی در نظریه اعداد حل میشه. http://en.wikipedia.org/wiki/Pentagonal_number_theorem یک مقدار ی سخت تره ولی واقعا قشنگه. یه خلاصه ای ازش اینه که میگه $p[n]$ رو تعداد راه های افراز عدد n به اعداد کوچکتر و مساوی n بنامیم (دقت کنید که تعدادی که به دست میاد دقیقا یکی از تعدادی که شما در نظر دارید بیشتره، مثلا برای 5 یک علاوه بر 1 + 4 و 3 + 2 و ... یک حالت رو هم خود عدد 5 در نظر میگیره و در کل 7 حالت به دست میاره در ضمن این اعداد به ازای اعداد منفی 0 و به ازای 0، 1 هستند) و اگر اعداد پنج ضلعی با $g[i]$ نشون بدیم (اعداد پنج ضلعی مثل اعداد مثلثی و مربعی هستند، اعداد مثلثی : $n * (n + 1) / 2$ اعداد مربعی : $n ^ 2$ اعداد 5 ضلعی : $n * (3n - 1) / 2 $) این رابطه وجود خواهد داشت :

$$p[n] = p[n - g[1] ]+p[n - g[-1]] - p[n - g[2]] - p[n - g[-2]] + p[n - g[3]] + p[n - g[-3]] - ...$$

دقت کنید با اینکه دنباله تا ابد ادامه داره ولی از یه جایی به بعد که $n < g[i]$ میشه $p[n - g[i]]$ برابر 0 میشه و برای یک n طبیعی به سادگی در میاد. به علاوه راهی که در بالا ارائه شد از $O(n ^ 3)$ هستش ولی چیزی که الان ارائه شد از $O(n ^ 2)$( در عمل از این مقدار کمتره) کدش تقریبا یه همچین چیزی میشه :

image description

من خودم مجبور شدم این کد رو برای سوال 78 پروجکت اویلر بزنم چون گرچه سوالات قبلی با همین راه گفته شده حل میشد ولی سوال 78 به همچین اردری نیاز داره.

2014-06-12 13:07:23 -0500
هشئذذ 459 ● 6
پاک‌کردن   ویرایش پاسخ
نظرات

خیلی ممنون :-)

2014-06-12 13:59:50 -0500 ع ر م

خواهش می کنم!

2014-06-12 23:43:06 -0500 هشئذذ

پاسخ شما

فقط در صورتی که پاسخی برای این پرسش دارید، آن را اینجا بنویسید و برای بحث کردن از قسمت «ثبت‌ نظر» استفاده کنید. شما می‌توانید قبل از وارد شدن به سایت پاسخ خود را بنویسید. این پاسخ ذخیره می‌شود و زمانی که شما وارد سایت شدید یا ثبت‌نام کردید منتشر می‌شود.

پیش‌نمایش:

کلیه‌ی حقوق این سایت متعلق به کمیته‌ی ملی المپیاد کامپیوتر است.