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

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

آمار پرسش:

  • پرسیده شده: 2014-05-11 23:38:51 -0500
  • مشاهده شده: 360 بار
  • بروز شده: 2014-06-21 02:57:33 -0500

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

تعداد جواب های معادله ${1\over x}+{1\over y}={1\over n}$ در دستگاه اعداد صحیح

وزن شتر ها - دوره ی 23 - مرحله ی 1

یافتن یک مثلث آبی یا قرمز در گراف شش راسی

جایگشت اعداد 1تا 10

مجموع شماره صفحات 25 برگ جداشده از دفترچه صد برگ

شماره گذاری راسهای 45 ضلعی با اعداد ۰ تا ۹با داشتن یک ضلع برای هر زوج عدد مختلف

حداکثر فاصله 2نقطه در مربع

حالت بندي اناليز تركيبي اصل جمع …

یک سوال سخت برای من، ساده برای شما با تجربگان این راه!

راهنمایی برای حل سوالی از ﻛﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺪﻣﺎﺗﻲ

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

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

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

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

علائم ریاضی:

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

مساله بدهی 47 سنتی

5

شخصی 47 سنت طلبکار است. فرض کنیم پول نقد موجود صندوقدار شامل مقدار زیادی سکه های 1 و 5 و 10 و 25 سنتی است. صندوقدار به چند طریق مختلف می تواند بدهی شخص را بپردازد؟

آنالیز-ترکیبی
2014-05-11 23:38:51 -0500
ببعی 507 ● 6 ● 9 ● 25
پاک‌کردن   ویرایش سوال
نظرات

سلام میدونستید انجمن علمی نخبگان دانشگاه صنعتی شریف مسابقه تخصصی مهارت سنجی برنامه نویسی و داده کاوی گذاشته است آدرس سایتش www.fanavard.com

2015-08-06 09:17:55 -0500 امیر شکری

سلام میگم یک سر به سایت www.fanavard.ir بزنید. مسابقات برنامه نویسی شون شروع شده. گواهی رسمی از طرف دانشگاه شریف می ده. 50 تا سکه هم جایزشه

2016-10-26 05:53:12 -0500 امیر شکری

سلام میگم یک سر به سایت www.fanavard.ir بزنید. مسابقات برنامه نویسی شون شروع شده. گواهی رسمی از طرف دانشگاه شریف می ده. 50 تا سکه هم جایزشه

2016-10-26 06:12:49 -0500 امیر شکری

1 پاسخ

5

این مساله و بسیاری از مساله های مشابه را میتوانیم با کشیدن یک جدول به صورت خیلی ساده حل کنیم. یک جدول به اسم $P$ با ۴ سطر (به تعداد سکه ها) و ۴۷ ستون ( به میزان بدهی) در نظر بگیرید. ابتدا سکه ها را به ترتیب از کوچک به بزرگ مرتب میکنیم و آن ها را با عدد های $i=1\ldots4$ شماره گذاری میکنیم. یعنی مثلا سکه سوم معادل ۱۰ سنتی خواهد بود

حال $P[i,j]$ (عدد نوشته شده در سطر $i$ و ستون $j$ ) را به عنوان «تعداد روشهای خرد کردن $j$ سنت بدهی، با سکه های اول تا $i$ ام» تعریف میکنیم. مثلا در سطر $i=3$ میخواهیم تعداد روشهای خرد کردن هر مبلغ (شماره ستون $j$ ) با ۳ سکه اول (۱، ۵ و ۱۰ سنتی) را محاسبه کنیم. به عبارت دیگر $P[3,27]$ معادل تعداد روشهای پرداخت ۲۷ سنت با سکه های ۱، ۵ و ۱۰ سنتی خواهد بود. توجه کنید هنگام محاسبه سطر $i$ مجاز به استفاده از سکه های بعدی نیستیم، یعنی مثلا در سطر $i=3$ نمیتوانیم ۲۵ سنتی استفاده کنیم.

چطور مقادیر جدول را محاسبه کنیم؟

فرض کنید بخواهیم مقدار $P[i,j]$ را محاسبه کنیم. دو حالت داریم:

  1. اصلا از سکه $i$ ام استفاده نمی کنیم. در این حالت مساله مشابه وقتی است که میخواهیم $j$ سنت بدهی را فقط با سکه های $1\ldots i-1$ بپردازیم. لذا تعداد روشها برابر $P[i-1,j]$ خواهد بود.
  2. از سکه $i$ ام هم استفاده میکنیم. فرض کنید ارزش سکه $i$ ام را $k$ بنامیم (مثلا برای $i=3$ خواهیم داشت $k=10$ سنت). چون مبلغی که میخواستیم بپردازیم $j$ سنت بود، وقتی از یک سکه $k$ سنتی استفاده کنیم باقیمانده مبلغ $j-k$ خواهد بود. از طرف دیگر برای پرداخت $j-k$ سنت همچنان میتوانیم از سکه $i$ ام استفاده کنیم. پس تعداد روشها در این حالت برابر $P[i, j-k]$ خواهد بود.

چون تعداد روشهای پرداخت $j$ سنت با $i$ سکه اول برابر مجموع حالات فوق است پس باید این دو مقدار را جمع کنیم، یعنی $P[i,j]=P[i-1,j]+P[i,j-k]$. نکته مهم: در تعریف حالت ها طوری عمل کردیم که هیچ روشی تکراری محاسبه نشود.

مثال

فرض کنید بخواهیم ۲۷ سنت را فقط با سه سکه اول (۱، ۵ و ۱۰ سنتی) بپردازیم. یا از سکه ۱۰ سنتی استفاده نمی کنیم: در این حالت مساله به پرداخت ۲۷ سنت بدهی فقط با دو سکه اول (۱ و ۵ سنتی) مبدل میشود. یا از سکه ۱۰ سنتی استفاده میکنیم: در این حالت $27-10=17$ سنت باقی می ماند، و میتوانیم برای پرداخت آن همچنان از سه سکه اول استفاده کنیم.

پس داریم: $P[3,27]=P[2,27]+P[3,17]$

پرکردن جدول

حال شروع به پر کردن جدول میکنیم. در سطر اول میخواهیم تعداد روشهای پرداخت مقادیر مختلف را تنها وقتی یک نوع سکه (۱ سنتی) داریم بشماریم، بدیهی است برای پرداخت $j$ سنت با سکه های ۱ سنتی تنها یک روش داریم (استفاده از $j$ سکه ۱ سنتی). پس مقادیر سطر اول همگی ۱ است.

حال سطر دوم (وقتی حداکثر از سکه ۵ سنتی استفاده میکنیم): برای مقادیر کمتر از ۵ سنت نمیتوانیم از سکه ۵ سنتی استفاده کنیم، پس باید مقادیر سطر قبل را در همین سطر هم کپی کنیم (یعنی ۴ عدد اول این سطر ۱ خواهد بود). برای پرداخت ۵ سنت دو حالت داریم: اگر از سکه ۵ سنتی استفاده نکنیم همان مقدار سطر قبل $P[1,5]$ خواهد شد. اما اگر از سکه ۵ سنتی استفاده کنیم یک روش داریم که کل آن را با یک سکه ۵ سنتی بپردازیم. پس P[2,5]=P[1,5]+1=2. به همین ترتیب مقادیر بالاتر را محاسبه میکنیم.

نهایتا جدول پر شده به صورت زیر خواهد بود: image description

پس تعداد راه حل های خرد کردن ۴۷ سنت با هر ۴ نوع سکه، ۳۹ است.

بیشتر بخوانیم

به همین کار ساده ای که خیلی راحت با قلم و کاغذ انجام دادیم «برنامه نویسی پویا» یا Dynamic Programming گفته میشه که یک روش الگوریتمی خیلی مهم و پر کاربرد برای حل کردن خیلی از مساله ها هست. مطالعه اون رو از کتابهای الگوریتمی نظیر مساله های الگوریتمی یا ترجمه کتاب مقدمه ای بر الگوریتمها یا از اینترنت شدیدا توصیه میکنم. بعضی از مساله های مرحله سوم (آزمون عملی) هم با این روش حل میشه.

2014-05-13 02:03:32 -0500
کلاه قرمزی 3097 ● 21 ● 34 ● 57
پاک‌کردن   ویرایش پاسخ

پاسخ شما

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

پیش‌نمایش:

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