AKB Forums

Go Back   AKB Forums > Technical sections > Algorithms
Home Register Blogs FAQ Members List Calendar Downloads Arcade Mark Forums Read

Algorithms The source of algorithms for your project

Troubles when posting message? Click here! :: Проблемы с отправлением сообщения? Нажмите сюда!

Reply
 
LinkBack Thread Tools Display Modes
Old Nov 7, 2002, 07:51   #1
4294967296
 
Boyov's Avatar
 
Join Date: Mar 2002
Location: /proc/1
Posts: 378
Rep Power: 7
Reputation: 10
Post zadacha

Zdarova lyudi,

Goda 2 nazad na olimpiade po informatike mne popalas' sleduyuschaya zadacha:

Dano chislo N (N<=200) nujno nayti skol'kimi sposobami eto chislo mojno predstavit' v vide summi nepovtoryayushixsya natural'nix chisel.

Naprimer dlya N=10 eto chishlo budet 10.

1.10=10+0
2.10=1+9
3.10=8+2
4.10=7+3
5.10=6+4
6.10=1+2+7
7.10=1+3+6
8.10=1+4+5
9.10=2+3+5
10.10=1+2+3+4

po moemu vse.

Koroche eta zadacha 'legko ' reshaetsya esil delaesh sami naitupeishi perebor (tipa 26(!!!) vlojennix ciklov), no estestvenno eto reshenie nel'zya schitat' "xelqin motik".

Kakie u vas budut idei ?

Spasibo

Boyov
__________________
Free your mind and your OS will follow
Boyov is offline   Reply With Quote Quote selected
Old Nov 7, 2002, 15:40   #2
Младенец
 
di0phantus's Avatar
 
Join Date: May 2002
Location: Yerevan, RA
Posts: 58
Rep Power: 0
Reputation: 10
Exclamation

xorsho bi utochnit' odnu vazhuyu detal'...
predlogaetsya pokazat' vse resheniaya, ili prosto vivesti chislo vsevozmozhnix predstavlenii`?
__________________
Все не так уж важно ...
di0phantus is offline   Reply With Quote Quote selected
Old Nov 7, 2002, 16:01   #3
hex god
 
Griffon2-7's Avatar
 
Join Date: Mar 2002
Location: Yerevan, AM
Posts: 3,173
Rep Power: 7
Reputation: 19
Send a message via ICQ to Griffon2-7
Post

Если учитывается вариант 10+0=10, то почему не учитываются остальныер варианты, где фигурирует 0?

Например: 0+1+2+3+4=10

Может 0 вообще не надо учитывать? Число вариантов уменьшится в 2 раза
__________________
Ленинградское время 0 часов 0 минут
Griffon2-7 is offline   Reply With Quote Quote selected
Old Nov 7, 2002, 16:14   #4
4294967296
 
Boyov's Avatar
 
Join Date: Mar 2002
Location: /proc/1
Posts: 378
Rep Power: 7
Reputation: 10
Post

Quote:
Originally posted by di0phantus:
xorsho bi utochnit' odnu vazhuyu detal'...
predlogaetsya pokazat' vse resheniaya, ili prosto vivesti chislo vsevozmozhnix predstavlenii`?
nujno prosto vichislit' kolichestvo

Boyov
__________________
Free your mind and your OS will follow
Boyov is offline   Reply With Quote Quote selected
Old Nov 7, 2002, 16:37   #5
Младенец
 
di0phantus's Avatar
 
Join Date: May 2002
Location: Yerevan, RA
Posts: 58
Rep Power: 0
Reputation: 10
Post

Code:
int getCount (int number){
  return getIt(number, number);
}

int getIt(int number, int pieces){
  if (pieces == number)
    return 1;
  return getForEveryPieces(number, pieces) + getIt(number, pieces-1);
}
a eto funkciaya vozvrashyaet reshenie zadachi s myachami, po kombinatorike
formulu ne pomnyu nado vivesti. zadacha takaya.
Code:
SUM(x[i]) = N, i = 1, ..., k.
x[i] >= a; pri lyubom i.
(a=1 eto nash sluchay)
no eto reshenie vklyuchaet takzhe povtori, tipa
Code:
primer N=5, k=3, a=1 
1+2+2
2+1+2
2+2+1
tak chto nado otvet razdelit na
Code:
k!. 
int getForEveryPieces (int number, int pieces){
}
naverno tak.
__________________
Все не так уж важно ...
di0phantus is offline   Reply With Quote Quote selected
Old Nov 7, 2002, 19:28   #6
Младенец
 
Join Date: May 2002
Location: Yerevan
Posts: 5
Rep Power: 0
Reputation: 10
Post

Можно так.
Здесь counts[i][j] - количество вариантов разложений числа i, в которых числа меньше j.
Используется следующее рекуррентное соотношение counts[i][j] = counts[i][j-1] + counts[i - j + 1][j-1]

Code:
 
#include <iostream>
#include <vector>
using namespace std;
typedef vector<int> intVec;

int main()
{
	int n;
	cin >> n;
	
	vector <intVec> counts;
	counts.resize(n+1);
	for (int i = 0; i < n + 1; i++)
		counts[i].resize(n + 2);

	for (int i = 1; i < n + 1; i++)
		counts[i][1] = 0;
	for (int i = 2; i < n + 2; i++)
		counts[1][i] = 1;
	
	for (int i = 2; i <= n; i++)
		for (int j = 2; j <= n+1; j++)
			if (j > i) 
				counts[i][j] = counts[i][i] + 1;
			else
				counts[i][j] = counts[i][j-1] + counts[i-j+1][j-1];

	cout << counts[n][n+1] << endl;

	return 0;
}
Временная сложность этого алгоритма O(N²), что при N <= 200 приемлимо.
Grigor is offline   Reply With Quote Quote selected
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT. The time now is 22:00.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
This board was founded on September 29, 2001
Powered by Viper Internet

Affordable Web Hosting | ParevNet

Buy text link