(演算法設計與分析)實驗四 貪心演算法

2021-10-07 04:04:16 字數 4333 閱讀 1052

理解並實踐貪心演算法。

1、完成教材第4章7個應用範例中的至少4個(任選4個實現即可)。

2、理解函式式程式設計正規化,嘗試用c++11進行函式式程式設計。

(1)活動安排問題

**:

#include

using

namespace std;

#define num 50

void

greedyselector

(int n,

int s,

int f,

bool b)

else

b[i]

=false;}

}int

main()

;int f=

;bool b[num]

;int n =

(sizeof

(s)/

sizeof

(s[0])

)-1;

greedyselector

(n, s, f, b)

; cout<<

"活動安排如下:"

<

for(

int i =

1; i <= n; i++

)return0;

}

結果:

(2)最優裝載

**:

#include

using

namespace std;

const

int n =4;

template

<

class

type

>

void

swap

(type &x, type &y)

void

bublesort

(int w,

int t,

int n)

for(

int i =

1; i < n; i++)}

swap

(t[i]

, t[temp]);

}}void

bestload

(int w,

int x,

int c,

int n)

;bublesort

(w, t, n)

;for

(int i =

1; i <= n; i++

)for

(int i =

1; i <= n&& w[t[i]

]<= c; i++)}

intmain()

;int x[n +1]

; cout <<

"可承載重量為:\n"

<< c << endl;

cout <<

"物品的重量分別為:"

<< endl;

for(

int i =

1; i <= n; i++

) cout << endl;

bestload

(w,x, c, n)

; cout <<

"選擇的物品重量為:"

<< endl;

for(

int i =

1; i <= n; i++

) cout << endl;

}

結果:

(3)哈夫曼編碼

**:

#include

#include

#include

using

namespace std;

class

node

string content;

float weight;

node* leftchild;

node* rightchild;

string code;};

void

insertion_sort

(node*

* array,

int low,

int high)

array[j+1]

=tem;}}

void

create_huffman_tree

(string* s,

float

* w,

int n,node*

* array)

insertion_sort

(array,

0,n)

;int p=0;

while

(p!=n-1)

}void

create_huffman_code

(node* p)

node* r=cur-

>rightchild;

if(r!=

null)if

(l==

null

&&r==

null)}

}int

main

(int argc,

char

** ar**)

;float w[8]

=;cout<<

"出現的字母:"

;for

(int i=

0;i<

8;i++

) cout<

cout<<

"出現的次數:"

;for

(int i=

0;i<

8;i++

) cout<

"編碼結果:"

<

create_huffman_tree

(s,w,

8,array)

;create_huffman_code

(array[7]);}

結果:

(4)最小生成樹

**:

#include

#include

#include

using

namespace std;

struct edge};

bool

cmp(edge a, edge b)

intfindfather

(vector<

int> father,

int x)

int z;

while

(a != father[a]

)return x;

}void

kruskal

(int n,

int m, vector

&e, vector

&res,

float

&totalcost)

sort

(e.begin()

, e.

end(

), cmp)

;for

(int i =

0; i < m;

++i)}}

intmain()

;random_shuffle

(e.begin()

, e.

end())

; cout <<

"無向圖: "

<< endl;

for(size_t i =

0; i < e.

size()

;++i)

cout <

int n =6;

int m =10;

vector res;

float totalcost =0;

kruskal

(n, m, e, res, totalcost)

; cout <<

"最小生成樹: "

<< endl;

for(size_t i =

0; i < res.

size()

;++i)

cout << endl;

cout <<

"邊數量: "

<< res.

size()

<< endl;

cout <<

"權值之和: "

<< totalcost << endl;

return0;

}

演算法設計與分析 貪心演算法

time limit 1000 ms memory limit 65536 kib problem description 一輛汽車加滿油後可行駛n公里。旅途中有若干個加油站。設計乙個有效演算法,指出應在哪些加油站停靠加油,使沿途加油次數最少。並證明演算法能產生乙個最優解。對於給定的n和k個加油站位...

演算法設計與分析 貪心演算法

分解 將原問題求解過程劃分為連續的若干個決策階段 決策 在每乙個階段依據貪心策略進行貪心決策,得到區域性的最優解,並縮小待求解問題的規模 合併 將各個階段的區域性解合併為原問題的乙個全域性最優解 greedy c c是問題的輸入集合即候選集合 初始解集合為空集 while not solution ...

演算法設計與分析 貪心演算法

所謂貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,但對範圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。貪心演算法的基本思路如下 1.建立數學模型...