You are on page 1of 11

Chương 4

Phương pháp Tham lam


(Greedy Method)
Nội dung
1. Khái niệm

2. Các loại thuật toán tham lam

3. Các loại thuật toán tham lam

2
1. Khái niệm
Thuật toán tham lam là một cách tiếp cận
để giải quyết vấn đề bằng cách chọn phương án
tốt nhất hiện có mà không cần quan tâm về kết
quả trong tương lai mà nó sẽ mang lại. Nói cách
khác, nó sẽ lựa chọn tốt nhất một cách cục bộ
nhằm mục đích tạo ra kết quả tốt nhất trên toàn
cục.

3
1. Khái niệm
Thuật toán tham lam được thực hiện như sau:
Ban đầu, tập giải pháp (chứa các câu trả lời) là
rỗng.
Ở mỗi bước, một phần tử được thêm vào tập
giải pháp.
Nếu tập giải pháp là khả thi, phần tử hiện tại
được giữ lại.
Mặt khác, phần tử sẽ bị loại bỏ và không bao
giờ được xem xét lại.
4
2. Các loại thuật toán tham
lam
Lựa chọn và Thực thi:
Frog Jumping: Thường là mảng. Kiểu thuật toán
này thường đi với kiểu tọa độ của các bài toán
quy hoạch động.
Các thuật toán đồ thị, chẳng hạn như thuật toán
cây khung tối thiểu (Prim và Kruskal), tìm đường
đi nhỏ nhất(Dijkstra).

5
3. Ví dụ
Bài toán đặt ra:
Ta phải thực hiện thay đổi một số tiền bằng
cách sử dụng số lượng tờ tiền nhỏ nhất có thể.
Tổng số tiền là: 28.000đ
Các đồng có sẵn:
Tờ 5.000 đ
Tờ 2.000 đ
Tờ 1.000 đ

6
3. Ví dụ
Giải pháp như sau:
+ Tạo tập giải pháp trống = {}.
+ Số tờ = {5000, 2000, 1000}.
+ Tổng = 0.
+ Trong khi tổng khác 28000, ta sẽ làm như sau.
+ Chọn một tờ C từ các tơ tiên sao cho tổng + C
<28000.
+ Nếu C + tổng > 28000, trả về là vô nghiệm.
+ Nếu không, tổng = tổng + C.
+ Thêm C vào tập giải pháp.
7
3. Bài tập
Cách 2: Chia lấy phần nguyên mệnh giá tiền từ lớn
đến nhỏ.

8
3. Bài tập
Có một máy ATM với số lượng tiền có trong máy là
vô hạn. Máy có bốn loại tiền là 500.000 VNĐ
200.000 VNĐ 100.000 VNĐ, 50.000 VNĐ, 20.000
VNĐ, và 10.000 VNĐ. Một khách hàng cần rút số
tiền là n (n chia hết cho 10.000), hãy tìm ra phương
án đưa tiền cho khách hàng sao cho số tờ tiền là ít
nhất. Giả sử số lượng các tờ tiền là vô hạn.

9
3. Ví dụ
#include <iostream>
#include <stdlib.h>
using namespace std;

int main(){ int n;


do
{
cout << "moi ban nhap so tien: "; cin >> n;
} while (n<10000);
if (n % 10000 != 0){
cout << "so tien phai chia het cho 10.000\n";
return 1;
}
10
3. Ví dụ
int motTram = n/100000;
n = n % 100000;
int namMuoi = n/50000;
n = n % 50000;
int haiMuoi = n/20000;
n = n % 20000;
int muoi = n/10000;
cout<<"Ket qua: \n";
cout<<motTram<<" x 100.000 + "<<namMuoi<<" x 50.000 +
<<haiMuoi<<" x 20.000 + "<<muoi<<" x 10.000"<<endl;
system("pause");
return 0;
} 11

You might also like