Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2015, 19:18   #1
grizzzlly
Новичок
Джуниор
 
Регистрация: 04.09.2008
Сообщений: 2
По умолчанию Помогите с задачей

Вечер добрый. Подскажите хотя бы алгоритм.
Игровой автомат принимает монеты только двух видом а рублей и b рублей. У игрока имеется неограниченный набор монет а и b, Удастся ли набрать s рублей, без сдачи. s,a,b вводятся пользователем.
grizzzlly вне форума Ответить с цитированием
Старый 22.09.2015, 19:26   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Берете максимальное из а и б. Делите с на максимум с остатком. Берете остаток и делите на меньшее, если остаток 0, то набрали. Годится?
p51x вне форума Ответить с цитированием
Старый 22.09.2015, 19:30   #3
grizzzlly
Новичок
Джуниор
 
Регистрация: 04.09.2008
Сообщений: 2
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Берете максимальное из а и б. Делите с на максимум с остатком. Берете остаток и делите на меньшее, если остаток 0, то набрали. Годится?
К сожалению не все так просто. Например с = 57, а =5, б=7. Максимум 7, 57 mod 7 = 1, 1 mod 5 !=0
grizzzlly вне форума Ответить с цитированием
Старый 22.09.2015, 19:48   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В цикле начиная с ноль монет любого достоинства до тех пор пока или их сумма превысит s, или остаток s делится нацело на монету другого достоинства. Насчет оптимальности не думал, может решение p51x по другому сформировать и будет сильно оптимальней
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 22.09.2015 в 19:50.
Аватар вне форума Ответить с цитированием
Старый 22.09.2015, 22:31   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
К сожалению не все так просто.
Ну значит надо делать и для второго числа. Сделать параллельно и все.
p51x вне форума Ответить с цитированием
Старый 23.09.2015, 11:17   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Так не получится. Вообще-то это диофантово уравнение первой степени с двумя неизвестными и сводится к нахождению НОД а и b, и если этот НОД является делителем s, то все ok, иначе неудача. Насколько нахождение НОД оптимальней цикла предложенного в #4 пусть ТС разбирается

И тоже не совсем так - так показывается, что есть решение в целых числах, в том числе и отрицательных. А нужно показать факт существования решения в неотрицательных числах
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 23.09.2015 в 11:31.
Аватар вне форума Ответить с цитированием
Старый 24.09.2015, 11:39   #7
Gekan
Пользователь
 
Регистрация: 29.06.2012
Сообщений: 39
По умолчанию

Примерно так можно.

Код:
#include <iostream>
using namespace std;

void main()
{
	setlocale(0,"");
	int s=55, x=5, y=7;
	cout<<"s = "<<s<<endl;
	cout<<"x = "<<x<<endl;
	cout<<"y = "<<y<<endl;
	int m = max(x,y)/min(x,y);
	int n = max(x,y) % min(x,y);	
        //чуть сокращаем время
        if (n==0)
	{
		if (s%min(x,y)!=0)
			cout<<"Не удастся набрать " <<s<<" рублей"<<endl;
		else
			cout<<"Удастся набрать " <<s<<" рублей"<<endl;
		return;
	}
	for (int i=0; i<=s/x;i++)
		for (int j=0; j<=s/y;j++)
			if (i*x+j*y==s)
			{
				cout<<"Удастся набрать " <<s<<" рублей"<<endl;
				return;
			}
	cout<<"Не удастся набрать " <<s<<" рублей"<<endl;
}
Gekan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите с задачей Alex26RusLink Помощь студентам 3 25.10.2009 02:27
Помогите с задачей Noxil Паскаль, Turbo Pascal, PascalABC.NET 2 30.10.2008 19:20
помогите с задачей StakanpORTvejna Паскаль, Turbo Pascal, PascalABC.NET 1 11.10.2008 19:19
Помогите с задачей.. vit_al Паскаль, Turbo Pascal, PascalABC.NET 3 24.04.2008 13:48