理解並實踐貪心演算法。
1、完成教材第4章7個應用範例中的至少4個(任選4個實現即可)。(1)活動安排問題2、理解函式式程式設計正規化,嘗試用c++11進行函式式程式設計。
**:
#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.建立數學模型...