알고리즘 백과 사전 (c, C++)
첫째, 수 이론 알고리즘
1. 두 숫자의 최대 공약수 찾기
Function gcd(a, b: integer): integer;
Begin
If b = 0 then gcd: = a
Elsegcd: = gcd (b, a mod b);
End;
2. 두 숫자의 최소 공배수를 구하십시오
Function lcm(a, b: integer): integer;
Begin
If alt;; B then swap(a, b) :
Lcm: = a;
While LCM mod bgt;; 0 도 Inc (LCM, a);
End;;
3. 소수를 구하는 방법
A. 작은 범위에서 숫자가 소수인지 여부를 판단합니다.
Functionprime (n: integer): 부울;
Var I: integer;;
Begin
For I: = 2 to trunc (sqrt (n)) do
If n mod I=0 then begin
Prime: = false; Exit;;
End;;
Prime: = true;
End;;
B. longint 범위의 수가 소수인지 여부를 결정합니다 (50,000 이내의 소수 테이블 포함):
Procedure getprime;;
Var
I, j: longint;
P: array: = true.
For I:=1 to n do
For j: = w [I] to v do f [I, j]: = f [I-1, j-w [I]];
최적화: 현재 상태는 이전 단계 상태와만 관련이 있으며 1 차원으로 떨어질 수 있습니다.
F [0]: = true;
For I:=1 to n do begin
F1: = f;
For j: = w [I] to v do
If [j-w [I]] then f1 [j]: = true;
F: = f1;
End;;
B. 넣을 수 있는 최대 가치를 구하다.
F[I, j] 는 용량이 I 일 때 처음 j 개의 배낭을 가져갈 때 얻을 수 있는 최대 가치입니다.
F [i, j] = 최대 {f[ I-w [j], j-1]+p [j], f [I, j-1]}
C. 정확히 가득 찬 상황의 수를 찾으십시오.
Dp:
Procedure update;;
Var j, k: 인터거;
Begin
C: = a;
For j:=0 to n do
If a [j] gt; 0 then
If j+now lt; =n then inc(c[j+now], a [j]);
A: = c;
End;;
2. 반복 가능한 백팩
A 최대 들어갈 수 있는 무게를 구하다.
F[I, j] 처음 I 개 항목 중 몇 개를 선택하여 볼륨이 정확히 j 가 되도록 하는 기호를 부울로 선택합니다.
상태 전이 방정식은
입니다F[I, j] = f [I-1, j–w [I] * k] (k = 1 .. j div w [I])
B. 넣을 수 있는 최대 가치를 구하다.
USACO 1.2 Score Inflation
한 차례의 경연대회를 진행하는데, 총 시간 T 가 고정되어 있고, 몇 가지 선택 가능한 제목이 있는데, 각 제목은 선택할 수 있는 수에 제한이 없고, 각 제목마다 ti (이 문제를 푸는 데 필요한 시간) 와 si (이 문제를 푸는 점수) 가 하나 있는데, 지금은 몇 개의 제목을 선택하여 이 문제를 푸는 총 시간이 T 이내라는 전제하에 얻은 총점이 가장 크다.
* 쉽게 생각할 수 있음:
F[i, j] = 최대 {f [I-k * w [j], j-1]+k * p [j]} (0lt; = KLT; = I div w[j])
여기서 f[i, j] 는 용량이 I 일 때 상위 j 종 배낭으로 얻을 수 있는 최대값을 나타냅니다.
* 구현:
Begin
FillChar(f, SizeOf(f), 0);
For i:=1 To M Do
For j:=1 To N Do
If I-problem [j]. timegt; =0 Then
Begin
T: = problem [j]. point+f [I-problem [j]. time];
If tgt;; F [I] then f [I]: = t;
End;;
Writeln (f [m]);
End.
C. 정확히 가득 찬 상황의 수를 찾으십시오.
Ahoi2001 Problem2
자연수 N 의 본질이 다른 소수와 합을 구하는 표현식의 수.
사고 1, 각 소수를 생성하는 계수의 배열, 하나하나 테스트하는 것이 통법이다.
Procedure try (dep: integer);
Var I, j: integer;
Begin
Cal;; {이 절차에서는 현재 계수의 계산 결과를 계산합니다. now 는 결과입니다 }
If nowgt;; N then exit;; {가지 치기 }
If dep=l+1 then begin {모든 계수 생성 }
Cal;;
If now = n then Inc (tot);
Exit;;
End;;
For I: for i:=0 to n div pr[dep] do begin
Xs [dep]: = I;
Try (dep+1);
Xs [dep]: = 0;
End;;
End;;
아이디어 2, 재귀 검색 효율성 향상
Procedure try(dep, rest: integer);
Var I, j, x: integer;
Begin
If (restlt;; = 0) 또는 (dep = l+1) then begin
If rest = 0 then Inc (tot);
Exit;;
End;;
For I: for i:=0 to rest div pr[dep] do
Try(dep+1, rest-pr [dep] * I);
End;;
{메인: try (1, n); }
아이디어 3: 동적 프로그래밍을 사용하여
를 해결할 수 있습니다USACO1.2 money system
V 품목, 배낭 용량 n, 총 배치 방법 수를 찾습니다.
전이 방정식:
Procedure update;;
Var j, k: 인터거;
Begin
C: = a;
For j:=0 to n do
If a [j] gt; 0 then
For k:=1 to n div now do
If j+now * KLT; =n then inc(c[j+now*k], a [j]);
A: = c;
End;;
{메인}
Begin
리드 (노); {첫 번째 항목의 무게 읽기 }
I: = 0; {a[i] 는 배낭 용량이 I 인 경우의 총 배치 방법 }
While ilt;; =n do begin
A [I]: = 1; Inc(i, now); End;; {첫 번째 품목 중량의 정수 배수를 정의하는 중량 a 값은 1, 초기값으로 }
For i:=2 to v do
Begin
리드 (노);
업데이트; {동적 업데이트 }
End;;
Writeln (a [n]);
넷째, 정렬 알고리즘
A. 빠른 정렬:
Procedure qsort(l, r: integer);
Var I, j, mid:integer;;
Begin
I: = l; J: = r; Mid: = a [(l+r) div2]; {중간 위치의 현재 시퀀스 수를 중간 수로 정의 }
Repeat
While a [I] lt; Mid do Inc (I); {왼쪽 절반에서 중간 수보다 큰 수 찾기 }
While a [j] gt; Mid do dec (j); {오른쪽 절반에서 중간 숫자보다 작은 수 찾기 }
If ilt;; =j then begin {정렬 대상과 일치하지 않는 수 쌍 세트가 발견되면 교환 }
Swap(a[i], a [j]);
Inc (I); Dec (j); {계속 찾기 }
End;;
Until igt;; J;
If llt;; J then qsort(l, j); {두 숫자의 경계에 이르지 않으면 왼쪽 및 오른쪽 간격을 재귀적으로 검색합니다 }
If ilt;; R then qsort(i, r);
End;; {sort}
B. 정렬 삽입:
아이디어: 현재 a[1]..a[i-1] 이 정렬되어 있습니다. 이제 a[i] 를 삽입하여 a[1]..a[i] 를 정렬해야 합니다.
Procedureinsert _ sort;
Var I, j: integer;
Begin
For i:=2 to n do begin
A [0]: = a [I];
J: = I-1;
While a [0] lt; A[j] do begin
A [j+1]: = a [j];
J: = j-1;
End;;
A [j+1]: = a [0];
End;;
End;; {inset_sort}
C. 정렬 선택:
Procedure sort;;
Var I, j, k: integer;
Begin
For I: = 1 to n-1 do
For j: = I+1 to n do
If a [I] gt; A[j] then swap(a[i], a [j]);
End;;
D. 버블 정렬
Procedure bubble_sort;;
Var I, j, k: integer;
Begin
For I: = 1 to n-1 do
For j: for j:=n downto i+1 do
If a [j] lt; A[j-1] then swap( a[j], a [j-1]); {인접 요소 간 관계 비교 }
End;;
E. 힙 정렬:
Procedure sift(i, m: integer); {I 루트 하위 트리 조정 힙, m 은 총 노드 수 }
Var k: 인터거;
Begin
A [0]: = a [I]; K: = 2 * I; {완전한 이진 트리에서 노드 I 의 왼쪽 아이는 2*i, 오른쪽 아이는 2*i+1}
While klt;; =m do begin
If (klt;; M) 및 (a [k] lt; A [k+1]) then Inc (k); {a[k] 와 a[k+1] 중 큰 값 찾기 }
If a [0] lt; A [k] then begin a [I]: = a [k]; I: = k; K: = 2 * I; 끝
Else k: = m+1;
End;;
A [I]: = a [0]; {적절한 위치에 루트 배치 }
End;;
Procedure heapsort;;
Var
J: 인터거;
Begin
For j: = n div 2 down to 1 do sift (j, n);
For j: = n down to 2
Do begin
Swap(a[1], a [j]);
Sift(1, j-1);
End;;
' 동방뱀파이어' 빙설소설 txt 전집 무료 다운로드
lt; 연애 사건 gt; 중 마국명 연기가 향상되었습니까? 이전 캐릭터보다 좋은가요?