현재 위치 - 중국 분류 정보 발표 플랫폼 - 비즈니스 서비스 정보 - C 언어 알고리즘의 동시 사례와 분석은 무엇입니까?

C 언어 알고리즘의 동시 사례와 분석은 무엇입니까?

알고리즘 백과 사전 (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;;