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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2009, 18:12   #1
l.e.n.a
Новичок
Джуниор
 
Регистрация: 19.01.2009
Сообщений: 2
По умолчанию помогите разобраться с рекурсией с++

запуталась вроде бы с легкой задачкой .
есть 3 цены марок 17,5,1. максимальная цена посылки 55.
нужно составить все возможные комбинации рекурсиями...
пример : 50 == 6 видов марок 2*17+3*5+1*1=50
l.e.n.a вне форума Ответить с цитированием
Старый 10.02.2009, 20:32   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Насколько я понял, нужны все комбинации, когда сумма <= N?

Сначала вводите N (максимальная цена).
Далее выводятся все комбинации. Т.к. они все не умещаются в окне, сделал также вывод в файл "foutput.txt".
Если нужно, чтобы сумма была точно равна N, то нужно изменить условие (указал в листинге).

Код:
#include <iostream>
#include <conio.h>
#include <fstream>
#include <string>

using namespace std;

const int kol=3;
int cen[kol];
int cnt=0;
ofstream fout;
int N;

string arsItoS(int k)
 {
		string s="";
		int a;
		char c;
		if(k==0)
		{
			 s += (char)(k+48);
			 return s;
			}
		while(k>0)
		 {
			a = k%10;
			s += (char)(a+48);
			k /= 10;
		  }
		for(a=0;a<s.length()/2;a++)
		      {
			c = s[a];
			s[a] = s[s.length()-a-1];
			s[s.length()-a-1] = c;
		       } 
		return s;
	}
//-------

void rec(int tekcen,int k, string str)
 {
		int i,j,t;
		string tt;
	if(k==kol) 
	 {
			/* если нужно, чтобы сумма была равна N, то заменить условие на '==' */
			if(tekcen<=N)  
			 {
				cnt++;
				cout<<str<<endl;
				fout<<str<<endl;
			 }
			return;
		}
	if(tekcen>N) return;
	j=0;
	do
	 {
		tt = str;
		t = tekcen+cen[k]*j;
	  if(j!=0) tt += "+" + arsItoS(j) + "*" + arsItoS(cen[k]);
			rec(t,k+1,tt);
			j++;
		} while(t<=N);
	
	return;		
	}


int main(){
int i,j;
string str;
fout.open("foutput.txt");

cen[0]=17;
cen[1]=5;
cen[2]=1;

cout<<"N= ";
cin>>N;
cout<<endl;

for(i=0;i<kol;i++)
{
	j=1;
	while(cen[i]*j<=N)
	 {
		str = "";
		str += arsItoS(j)+"*"+arsItoS(cen[i]);
		rec(cen[i]*j,i+1,str);
		j++;
		}
}
cout<<"\nVsego: "<<cnt;
fout<<"\nVsego: "<<cnt;
fout.close();
getch();
return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с рекурсией biv171 Помощь студентам 1 02.11.2008 10:36
Факториал с рекурсией SaimaN Помощь студентам 2 24.09.2008 17:53
Помогите с рекурсией Serejka Общие вопросы Delphi 1 25.07.2008 15:36
Помогите плз с Рекурсией Dendy Паскаль, Turbo Pascal, PascalABC.NET 4 03.02.2008 22:44