PDA

View Full Version : كمك در درك الگوريتم حل



amir ghasemiyan
جمعه 30 خرداد 1393, 17:18 عصر
سلام دوستان

سوال: برنامه اي بنويسيد كه تعيين كند يك سكه 50 ريالي را به چند طريق ميتوان با سكه هاي 20 ريالي، 10 ريالي و 5 ريالي خرد كرد.(لازم است از تمام سكه ها استفاده شود)

ممنون ميشم اگه دوستان راهنمايي كنن روش حل به چه صورت هست.

rahnema1
یک شنبه 01 تیر 1393, 10:02 صبح
سلام دوستان

سوال: برنامه اي بنويسيد كه تعيين كند يك سكه 50 ريالي را به چند طريق ميتوان با سكه هاي 20 ريالي، 10 ريالي و 5 ريالي خرد كرد.(لازم است از تمام سكه ها استفاده شود)

ممنون ميشم اگه دوستان راهنمايي كنن روش حل به چه صورت هست.

سلام
برای شروع اول بگید مساله را بدون برنامه نویسی چه طور میشه حل کرد. راه حلش را بگید تا برسیم به مراحل بعدی. راه حلش خیلی ساده است

amir ghasemiyan
یک شنبه 01 تیر 1393, 12:08 عصر
سلام
برای شروع اول بگید مساله را بدون برنامه نویسی چه طور میشه حل کرد. راه حلش را بگید تا برسیم به مراحل بعدی. راه حلش خیلی ساده است

سلام عزيز
قربون قد و بالات. مشكل من همون روش حل بود ديگه. الگوريتمشو بفهمم برنامشو سه سوت مينويسم.

rahnema1
یک شنبه 01 تیر 1393, 16:15 عصر
آخه نکته کلیدیش همون روش حل شماست. برای راهنمایی میگم . جواب شما میشه "یک"
یعنی فقط یک روش برای خرد کردن پول 50 تومانی با 10 و 20 و 5 تومانی وجود داره در صورتی که بخواهیم از تمام سکه ها استفاده کنیم

amir ghasemiyan
یک شنبه 01 تیر 1393, 20:45 عصر
آخه نکته کلیدیش همون روش حل شماست. برای راهنمایی میگم . جواب شما میشه "یک"
یعنی فقط یک روش برای خرد کردن پول 50 تومانی با 10 و 20 و 5 تومانی وجود داره در صورتی که بخواهیم از تمام سکه ها استفاده کنیم

نه قربونت چند راه وجود داره. مثلا يك 20 تومني و يك 10 تومني و بقيش 5 تومني. يا يك 20 تومني و دو 10 تومني و بقيش 5 تومني

rahnema1
یک شنبه 01 تیر 1393, 23:15 عصر
این روش
http://www.sharefile.ir/uploads/1403475966.png

amir ghasemiyan
یک شنبه 01 تیر 1393, 23:29 عصر
این روش
http://www.sharefile.ir/uploads/1403475966.png

:متفکر: ممنون تقريبا متوجه شدم. مرسي

amir ghasemiyan
سه شنبه 03 تیر 1393, 23:21 عصر
براي دوستاني كه احيانا اين سوال براي اونها هم هست يك روش ديگه علاوه بر روش دوستمون من نوشتم اميدوارم بدرد دوستان بخوره


clear
clc

count=0;
for i=1:2
for j=1:5
for k=1:10
if i*20+j*10+k*5==50
count=count+1;
fprintf('%g ta 20 tomani & %g ta 10 tomani & %g ta 5 tomani\n',i,j,k)
end
end
end
end
fprintf('%g Method was found\n',count)

rahnema1
چهارشنبه 04 تیر 1393, 11:06 صبح
ببخشید ، 2 و 5 و 10 را از کجا آوردید؟

amir ghasemiyan
چهارشنبه 04 تیر 1393, 11:07 صبح
ببخشید ، 2 و 5 و 10 را از کجا آوردید؟

ديگه ديگه :لبخند:

حداكثر هر سكه است. 20 تومني حداكثر 2 تا و ده تومني حداكثر 5 تاو 5 تومني حداكثر 10 تا ميتونه باشه

مزيت اين روش اينه كه اگه صورت سوال گفته بود نيازي نيست از همه سكه ها استفاده بشه كافيه شمارنده رو بجاي اينكه از 1 شروع كنيم از 0 شروع كنيم

rahnema1
چهارشنبه 04 تیر 1393, 11:19 صبح
روش جالبیه. فقط چند نکته اگه بتونید همین که می گید حداکثر 2 تا 20 تومنی و ... را به صورت برنامه بنویسید خیلی عالی میشه. همچنین اگه حال داشتین یه فکری به حالش بکنید ببنید میشه تعداد محاسبات ( یعنی حلقه ها) کمتر بشه

amir ghasemiyan
چهارشنبه 04 تیر 1393, 11:25 صبح
روش جالبیه. فقط چند نکته اگه بتونید همین که می گید حداکثر 2 تا 20 تومنی و ... را به صورت برنامه بنویسید خیلی عالی میشه. همچنین اگه حال داشتین یه فکری به حالش بکنید ببنید میشه تعداد محاسبات ( یعنی حلقه ها) کمتر بشه

براي تعداد حلقه ها كه نميدونم ولي فكر نكنم بشه ولي در مورد قسمت اول بله امكان پذيره و خيلي هم راحته:



clear
clc
count=0;
N=50;
for i=1:floor(N/20)
for j=1:floor(N/10)
for k=1:floor(N/5)
if i*20+j*10+k*5==50
count=count+1;
fprintf('%g ta 20 tomani & %g ta 10 tomani & %g ta 5 tomani\n',i,j,k)
end
end
end
end
fprintf('%g Method was found\n',count)

rahnema1
چهارشنبه 04 تیر 1393, 11:31 صبح
نمی خوام کارت را زیاد کنم ولی اگه بشه مثلا پول خورد ها و مجموع اونها یعنی 50 را به عنوان پارامتر ورودی یک تابع بدیم و خروجی همون تعداد روش باشه خیلی خیلی عالی میشه. اگه اینجور بشه در مورد انواع پول خورد ها میشه تعمیم داد

amir ghasemiyan
چهارشنبه 04 تیر 1393, 12:20 عصر
نمی خوام کارت را زیاد کنم ولی اگه بشه مثلا پول خورد ها و مجموع اونها یعنی 50 را به عنوان پارامتر ورودی یک تابع بدیم و خروجی همون تعداد روش باشه خیلی خیلی عالی میشه. اگه اینجور بشه در مورد انواع پول خورد ها میشه تعمیم داد

خيلي فكر كردم ولي با اين روش چيزي به ذهنم نميرسه. چون تعداد نامعلومه نميشه به تعداد لازم متغير تعريف كرد.
شايد روش ديگه داشته باشه كه بشه حل كرد.:متفکر:

rahnema1
چهارشنبه 04 تیر 1393, 12:24 عصر
فکر کنم با تبدیل حلقه تودرتو به یک تابع بازگشتی بشه یه راه چاره براش پیدا کرد

amir ghasemiyan
چهارشنبه 04 تیر 1393, 12:25 عصر
فکر کنم با تبدیل حلقه تودرتو به یک تابع بازگشتی بشه یه راه چاره براش پیدا کرد

مرسي فكر خوبيه. روش كار ميكنم

amir ghasemiyan
پنج شنبه 05 تیر 1393, 03:30 صبح
آقا من هر چي فكر كردم چيزي به ذهنم نرسيد.
اين برنامه كه نوشتم فقط براي همين مورد خاص جواب ميده :لبخند:
شما خودت ببين ميتوني اصلاحش كني؟



clear
clc
N=50;
coins=[20,10,5];
Max=floor(N./coins);
counter=0;
for k=1:max(Max)
a=zeros(1,length(coins))+k;
for i=1:length(coins)
for j=1:max(Max)
Sum=sum(coins.*a);
if Sum==N
counter=counter+1;
A(counter,:)=a;
break
end
a(i)=j;
if a(i)>Max(i)
break
end
end
a(i)=k;

if i>1
a(i-1)=k;
end
end
end
fprintf('%g Method was found\n',counter)
if counter~=0
for i=1:(size(A))(2);
for j=1:length(coins)
if j==length(coins)
fprintf('%g adad %g tomani \n',A(i,j),coins(j))
else
fprintf('%g adad %g tomani & ',A(i,j),coins(j))
end
end
end
end




اگه بتوني اين ماتريس رو توليد كني حله: (هيچ رديفي نبايد تكرار بشه)
(تعداد سكه ها سه تا و حداكثر هر سكه 2 تا فرض شده)



1
1
1


2
1
1


2
2
1


2
1
2


2
2
2


1
1
2


1
2
1


1
2
2

rahnema1
پنج شنبه 05 تیر 1393, 15:19 عصر
این روش ( بر اساس روش شما) پول خورد و مقدار کل را می گیره و تعداد را بیرون میده البته میشه بهینه تر هم بشه

function count=PoolKhord(Sum,coins)
numloop=numel(coins);
loops=ones(1,numloop);
numIter=floor(Sum./coins);
count=0;
while (true)
if(sum(loops.*coins)==Sum)
count=count+1;
end
pos = numloop ;
loops(pos) = loops(pos) + 1;
while (loops(pos) > numIter(pos))
loops(pos) = 1;
pos=pos - 1;
if (pos < 1)
return ;
end
loops(pos) = loops(pos) + 1;
end
end
end


مثلا روش شما را میشه اینجور بهبود داد

clear
clc
Sum=50;
coins=[20 10 5];
last=coins(end);
Sum1=Sum-last;
count=0;
for i=1:floor(Sum/coins(1))
for j=1:floor(Sum/coins(2))
if((S=(i*coins(1)+j*coins(2)))>Sum1)
break;
end
if (~mod(S,last))
count=count+1;
end
end
end
fprintf('%g Method was found\n',count)