راه حل یک مرحله ای برای درک مشکل تغییر سکه

  • 2022-07-27

Your One-Stop Solution to Understand Coin Change Problem

این را تصور کنید ، به شما مجموعه ای از سکه ها با فرقه های مختلف و مبلغ عدد صحیح به شما نشان می دهد که کل مبلغ پول را نشان می دهد. شما باید کمترین سکه های مورد نیاز برای تشکیل این مبلغ را برگردانید. اگر این مبلغ ساخته نشود ، بازگش ت-1. دو راه حل برای مشکل تغییر سکه وجود دارد: اولین راه حل ساده لوحانه ، یک راه حل بازگشتی از برنامه تغییر سکه و دوم یک راه حل پویا است که یک راه حل کارآمد برای مشکل تغییر سکه است. پیچیدگی زمانی مشکل تغییر سکه (در هر صورت) (n*c) است و پیچیدگی فضا (n*c) (n) است.

برنامه تحصیلات تکمیلی: توسعه کامل وب پشته

برنامه نویسی پویا چیست؟

  • برنامه نویسی پویا یا DP یک تکنیک الگوریتمی برای حل مشکلات بهینه سازی با شکستن آنها به زیرنویس های ساده تر و بهره برداری از این واقعیت است که راه حل بهینه برای وضعیت کلی بستگی به راه حل بهینه برای زیرنویس های آن و استفاده از این واقعیت دارد که راه حل بهینهبه وضعیت کلی بستگی به راه حل بهینه برای زیرزمین های آن دارد.
  • برنامه نویسی پویا یک روش برنامه نویسی است که دقت یک جستجوی کامل را با کارآیی الگوریتم های حریص ترکیب می کند.
  • محدودیت اصلی برنامه نویسی پویا این است که فقط می تواند برای مشکلات تقسیم شده به مشکلات فرعی اعمال شود. علاوه بر این ، هر یک از مشکلات فرعی باید به تنهایی قابل حل باشند.
  • مفهوم زیرنویس های فرعی این است که می توان از این مشکلات فرعی برای حل یک مشکل مهم تر استفاده کرد. در نتیجه ، الگوریتم های برنامه نویسی پویا بسیار بهینه شده اند.
  • هدف از الگوریتم های حریص معمولاً بهینه سازی محلی است. از طرف دیگر ، رویکرد برنامه نویسی پویا سعی در بهینه سازی مشکل به طور کلی دارد.

اکنون که مفهوم برنامه نویسی پویا را درک کرده اید ، به مشکل تغییر سکه نگاه کنید.

آشنایی با مشکل تغییر سکه

به شما مجموعه ای از سکه ها با فرقه های مختلف و مبلغ عدد صحیح که نشان دهنده کل پول است ، به شما داده می شود. شما باید کمترین سکه های مورد نیاز برای تشکیل این مبلغ را برگردانید. اگر این مبلغ ساخته نشود ، بازگش ت-1.

coin-change-problem

چکمه کدگذاری Caltech

حال ، نگاهی بیندازید که مشکل تغییر سکه چیست.

به شما دنباله ای از سکه های فرقه های مختلف به عنوان بخشی از مشکل تغییر سکه داده می شود. به عنوان مثال ، مجموعه زیر را مجموعه ای از سکه ها در نظر بگیرید که هر عنصر یک فرقه متفاوت را نشان می دهد.

هدف ما استفاده از این سکه ها برای جمع آوری مقدار مشخصی از پول در حالی که از کمترین سکه (یا بهینه) استفاده می شود. علاوه بر این ، شما می توانید فرض کنید که یک فرقه معین دارای تعداد بی نهایت سکه است. به عبارت دیگر ، می توانید هر چند بار که می خواهید از یک فرقه خاص استفاده کنید.

به عنوان مثال ، اگر می خواهید با استفاده از فرقه های فوق به 78 برسید ، به چهار سکه ذکر شده در زیر نیاز خواهید داشت.

مجموعه دیگری از فرقه ها را در نظر بگیرید:

اگر می خواهید در مجموع 9 بسازید ، فقط به دو سکه در این فرقه ها نیاز دارید ، همانطور که در زیر آمده است:

با این حال ، اگر رویکرد الگوریتم حریص را به یاد بیاورید ، برای فرقه های فوق به سه سکه پایان می دهید (5 ، 2 ، 2). این به دلیل اولویت الگوریتم حریص برای بهینه سازی محلی است.

پس از درک یک مشکل تغییر سکه ، در این آموزش به شبه کد مشکل تغییر سکه نگاه خواهید کرد.

دوره جدید: توسعه کامل پشته برای مبتدیان

شبه کد مشکل تغییر سکه

مشکل تغییر سکه PseudoCode به شرح زیر است:

  • یک آرایه جدید را برای DynamicProg طول N+1 ، که در آن N تعداد تغییرات مختلف سکه ای است که می خواهید پیدا کنید ، آغاز کنید.
  • از آنجا که تنها یک راه برای تغییر 0 دلار وجود دارد ، DynamicProg [0] را به 1 تنظیم کنید.
  • از طریق آرایه برای هر تغییر سکه موجود تکرار کنید و مقدار DynamicProg [index-coins [i]] را به DynamicProg [Index] برای شاخص های مختلف از "1" تا "n" اضافه کنید.
  • DynamicProg [n] مقدار بازگشت

پس از درک مشکل تغییر سکه PseudoCode ، شما به راه حل های برنامه نویسی بازگشتی و پویا برای مشکلات تغییر سکه در این آموزش نگاه خواهید کرد.

راه حل های مشکل تغییر سکه

دو راه حل برای مشکل تغییر سکه وجود دارد -

بازگشت - رویکرد ساده لوح و آهسته.

برنامه نویسی پویا - یک رویکرد به موقع و کارآمد

حال ، به روش بازگشتی برای حل مشکل تغییر سکه نگاه کنید و اشکالاتی آن را در نظر بگیرید.

راه حل مشکل تغییر سکه با استفاده از بازگشت

برای هر سکه دو گزینه دارید: آن را درج کنید یا آن را حذف کنید.

هنگامی که یک سکه را درج می کنید ، مقدار آن را به محلول جمع فعلی اضافه می کنید (سکه های Sol+[i] ، من ، و اگر مساوی نباشد ، به سکه بعدی حرکت می کنید ، یعنی راه حل تماس بازگشتی بعدی (Sol ، I ++).

کل راه حل ها 4 هستند.

نمودار زیر تماسهای بازگشتی انجام شده در هنگام اجرای برنامه را نشان می دهد.

recursive-solution-of-coin-change-problem

روش بازگشتی باعث می شود که الگوریتم چندین بار همان زیرنویس ها را محاسبه کند. بنابراین ، برای حل کارآمد مشکل تغییر سکه ، می توانید از برنامه نویسی پویا استفاده کنید.

دوره کامل توسعه دهنده وب پشته

راه حل مشکل تغییر سکه با استفاده از برنامه نویسی پویا

رویکرد پویا برای حل مسئله تغییر سکه مشابه روش پویا است که برای حل مشکل 01 کوله پشتی استفاده می شود.

برای ذخیره راه حل برای زیرزمین ، باید از یک آرایه 2D (یعنی جدول) استفاده کنید. سپس به تصویر زیر نگاهی بیندازید.

dynamic-programming-solution-using-coin-change-problem.

  • اندازه DynamicProgtable برابر است با (تعداد سکه +1)*(جمع +1).
  • مقدار ستون اول یکی است زیرا اگر مقدار کل 0 باشد ، فقط یک راه برای تغییر وجود دارد (ما هیچ سکه ای را شامل نمی شویم).
  • ردیف: تعداد کل سکه ها. این واقعیت که شاخص ردیف اول 0 است نشان می دهد که هیچ سکه ای در دسترس نیست. اگر شاخص مقدار در ردیف دوم 1 باشد ، فقط اولین سکه در دسترس است. به طور مشابه ، اگر شاخص مقدار در ردیف سوم 2 باشد ، به این معنی است که دو سکه اول برای افزودن به کل و غیره در دسترس هستند. شاخص ردیف نمایانگر شاخص سکه در آرایه سکه ها است ، نه مقدار سکه.
  • ستون: مقدار کل (جمع). از آنجا که شاخص ستون اول 0 است ، مقدار جمع 0 است. شاخص ستون دوم 1 است ، بنابراین جمع سکه ها باید 1 باشد. به طور مشابه ، مقدار ستون سوم 2 است ، بنابراین تغییر 2 مورد نیاز است ، وبه زودی.

در نتیجه ، هر قسمت جدول راه حل را برای یک زیرنویس ذخیره می کند. به عنوان مثال ، DynamicProgtable [2] [3] = 2 دو روش برای محاسبه جمع سه با استفاده از دو سکه اول 1،2 را نشان می دهد.

نتیجه نهایی توسط مقادیر در ستون و ردیف آخر محاسبه می شود.

در این حالت ، شما باید تمام شاخص های موجود در جدول یادداشت (به جز ردیف و ستون اول) را حلقه کنید و از راه حل های قبلاً ذخیره شده برای زیرزمین ها استفاده کنید.

  • اگر مقدار سکه از DynamicProgsum بیشتر باشد ، سکه نادیده گرفته می شود ، یعنی DynamicProgtable [i] [j] = dynamicprogtable [i-1] [j].
  • اگر مقدار سکه کمتر از DynamicProgsum باشد ، می توانید آن را در نظر بگیرید ، یعنی DynamicProgtable [i] [j] = dynamicprogtable [i-1]. [dynamicprogsum]+dynamicprogtable [i] [j-coins [i-1]].

بعد از فهمیدن چگونگی حل آن ، به پیچیدگی مشکل تغییر سکه نگاه خواهید کرد.

پیچیدگی مشکل تغییر سکه

  • پیچیدگی حل مشکل تغییر سکه با استفاده از زمان و مکان بازگشتی خواهد بود:

مشکلات: با هم همپوشانی زیرمجموعه ها + پیچیدگی زمان

o (2n) پیچیدگی زمان است ، جایی که n تعداد سکه ها است

  • پیچیدگی زمان و فضا با استفاده از برنامه نویسی پویا برای حل مشکل تغییر سکه کاهش می یابد:

O (numberofcoins*totalamount) پیچیدگی زمان

o (numberofcoins*totalamount) پیچیدگی فضا است.

اکنون نمایش عملی از مشکل تغییر سکه را در زبان برنامه نویسی C مشاهده خواهید کرد.

اجرای کد مشکل تغییر سکه

1. کد راه حل بازگشتی برای مشکل تغییر سکه

int numberofcoins = 3 ، sum = 4 ؛

راه حل int (int sol ، int i)

if(numberofCoins == 0 || sol > sum || i>= numberofcoins)

دیگری اگر (sol == sum)

راه حل بازگشت (سول+سکه [i] ، i)+راه حل (sol ، i+1) ؛

printf ("کل راه حل ها: ٪ d" ، راه حل (0/0)) ؛

خروجی:

code1-of-coin-change-problem

2. کد راه حل برنامه نویسی پویا برای مشکل تغییر سکه

سکه های int [] = ، جمع = 4 ؛

int numberofcoins = 3 ؛

// تابع برای اولیه سازی ستون اول DynamicProgtable با 1

void initdynamicprogtable (int dynamicprogtable [] [5])

// ستون اول به 1

راه حل int (int dynamicprogtable [] [5])

int coinindex ، dynamicprogsum ؛

// مقدار سکه باید کمتر یا مساوی با مقدار جمع باشد تا آن را در نظر بگیرد

// بازگشت ردیف نهایی و مقدار ستون

printf ("کل راه حل ها: ٪ d" ، راه حل (dynamicprogtable)) ؛

خروجی:

/code2-dynamic-programming-solution.

پس از اجرای کد مشکل تغییر سکه ، اکنون به برخی از برنامه های مشکل تغییر سکه نگاه خواهید کرد.

دوره رایگان: اصول برنامه نویسی

برنامه های تغییر سکه

این الگوریتم می تواند برای توزیع تغییر ، به عنوان مثال در یک دستگاه فروش سودا که صورتحساب و سکه را می پذیرد و سکه ها را توزیع می کند ، استفاده شود.

خرید یک پاپ سودا 60 درصدی با یک دلار یک نمونه است. این 40 سنت تغییر می کند ، یا در ایالات متحده ، یک چهارم ، یک سکه و یک نیکل برای کوچکترین پرداخت سکه. با این حال ، اگر لوله نیکل خالی بود ، دستگاه چهار قطعه را از بین می برد.

نکته آخر اینکه در این مقاله مشکل تغییر سکه ، تمام موضوعاتی را که تاکنون مورد بررسی قرار داده اید خلاصه خواهید کرد.

مراحل بعدی

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

فرض کنید شما می خواهید چیزهای بیشتری داشته باشید که فراتر از توسعه موبایل و نرم افزار باشد و امروزه بیشترین زبانها و مهارت های برنامه نویسی را در آن قرار می دهد. در این حالت ، دوره توسعه کامل پشته Simpleilearn مناسب است.

آیا در مورد این آموزش مشکل تغییر سکه سوالی دارید؟اگر این کار را کردید ، لطفاً آنها را در بخش نظرات در پایین این صفحه بگذارید. کارشناسان ما خوشحال خواهند شد که تا حد ممکن به سؤالات شما پاسخ دهند!

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

کارتیک منون

Kartik یک استراتژیست با تجربه محتوا و یک متخصص بازاریابی فناوری برجسته است که علاقه مند به طراحی تجربیات کاربر با راه حل های یکپارچه بازاریابی و ارتباطی است.

ثبت دیدگاه

مجموع دیدگاهها : 0در انتظار بررسی : 0انتشار یافته : ۰
قوانین ارسال دیدگاه
  • دیدگاه های ارسال شده توسط شما، پس از تایید توسط تیم مدیریت در وب منتشر خواهد شد.
  • پیام هایی که حاوی تهمت یا افترا باشد منتشر نخواهد شد.
  • پیام هایی که به غیر از زبان فارسی یا غیر مرتبط باشد منتشر نخواهد شد.