SlideShare a Scribd company logo
1 of 3
Download to read offline
1
Bài toán đổi tiền xu
Phát biểu: Giả sử có các mệnh giá tiền xu là x1, x2, …, xk. Tìm số lượng đồng tiền
xu nhỏ nhất để có thể đổi n xu.
Cho rằng, đồng xu có mệnh giá nhỏ nhất là 1 xu để đảm bảo luôn có lời giải.
Giải thuật
moneyChange(coins[1..k], money) {
minCoins = money;
for (i = 1; i  k; i++)
if (coins[i] == money)
return 1;
for (i = 1; i  money / 2; i++) {
tmpSum = moneyChange(coins, i) + moneyChange(coins, money - i);
if (tmpSum < minCoins)
minCoins = tmpSum;
}
return minCoins;
}
2
Giảm để trị
Tính an
Chia để trị:
Giảm để trị:
Bài toán đổi tiền xu
Giải thuật
moneyChange(coins[1..k], money) {
minCoins = money;
for (i = 1; i  k; i++)
if (coins[i] == money)
return 1;
for (i = 1; i  k; i++)
if (money > coins[i]) {
tmpSum = 1 + moneyChange(coins, money - coins[i]);
if (tmpSum < minCoins)
minCoins = tmpSum;
}
return minCoins;
}
3
Vấn đề chọn
Phát biểu: Tìm phần tử nhỏ thứ k trong dãy S = {s1, s2, …, sn}, với k [1, n].
Chọn (ngẫu nhiên) phần tử pivot thuộc dãy S và tách S thành 3 dãy con:
– Sleft: chứa các phần tử nhỏ hơn pivot.
– Spivot: chứa các phần tử bằng pivot.
– Sright: chứa các phần tử lớn hơn pivot.
với chi phí tuyến tính.
Giải thuật xử lý như sau:
– Nếu k  |Sleft|: Tìm kiếm phần tử nhỏ thứ k trong dãy Sleft.
– Nếu |Sleft| < k  |Sleft| + |Spivot|: pivot chính là giá trị nhỏ thứ k cần tìm.
– Nếu |Sleft| + |Spivot| < k: Tìm kiếm phần tử nhỏ thứ k – (|Sleft| + |Spivot|) trong dãy Sright.
Cài đặt không sử dụng mảng phụ
Sau một phép phân hoạch với pivot là phần tử chốt, ta có được pos là vị trí của
pivot trong S. Nhận thấy:
– Nếu pos = k: pivot chính là phần tử nhỏ thứ k trong dãy.
– Nếu pos > k: phần tử nhỏ thứ k thuộc về Sleft = {s1, …, spos–1}.
– Nếu pos < k: phần tử nhỏ thứ k thuộc về Sright = {spos+1 , …, sn}.
Giải thuật
Selection(S[1..n], lower, upper, k) {
index = random(lower, upper);
pos = Partition(S, lower, upper, index); // S[pos] = pivot
if (pos == k)
return S[pos];
if (pos > k)
Selection(S, lower, pos – 1, k);
if (pos < k)
Selection(S, pos + 1, upper, k);
}
Partition(S, lower, upper, pos) {
pivot = S[pos];
S[lower]  S[pos];
pos = lower;
for (i = lower + 1; i  upper; i++)
if (pivot > S[i]) {
pos++;
S[i]  S[pos];
}
S[lower]  S[pos];
return pos;
}

More Related Content

Viewers also liked

Casablanca study guide
Casablanca study guide Casablanca study guide
Casablanca study guide Edward Bowen
 
виды музыкальной деятельности
виды музыкальной деятельностивиды музыкальной деятельности
виды музыкальной деятельностиs1erra123
 
Balneoterapija u rehabilitaciji pacijenata sa osteoporozom
Balneoterapija u rehabilitaciji pacijenata sa osteoporozomBalneoterapija u rehabilitaciji pacijenata sa osteoporozom
Balneoterapija u rehabilitaciji pacijenata sa osteoporozomMedical school Novi Sad
 
Deus do secreto - ministério sarando a terra ferida
Deus do secreto - ministério sarando a terra feridaDeus do secreto - ministério sarando a terra ferida
Deus do secreto - ministério sarando a terra feridaJosiane Ap. Pontes dos Santos
 

Viewers also liked (6)

Casablanca study guide
Casablanca study guide Casablanca study guide
Casablanca study guide
 
виды музыкальной деятельности
виды музыкальной деятельностивиды музыкальной деятельности
виды музыкальной деятельности
 
Balneoterapija u rehabilitaciji pacijenata sa osteoporozom
Balneoterapija u rehabilitaciji pacijenata sa osteoporozomBalneoterapija u rehabilitaciji pacijenata sa osteoporozom
Balneoterapija u rehabilitaciji pacijenata sa osteoporozom
 
Deus do secreto - ministério sarando a terra ferida
Deus do secreto - ministério sarando a terra feridaDeus do secreto - ministério sarando a terra ferida
Deus do secreto - ministério sarando a terra ferida
 
CD Polígono Sur
CD Polígono SurCD Polígono Sur
CD Polígono Sur
 
LA SEVILLA ROMANA: EL ANTIQUARIUM
LA SEVILLA ROMANA: EL ANTIQUARIUMLA SEVILLA ROMANA: EL ANTIQUARIUM
LA SEVILLA ROMANA: EL ANTIQUARIUM
 

More from Hồ Lợi

Tóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cTóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cHồ Lợi
 
Lect04 functions
Lect04 functionsLect04 functions
Lect04 functionsHồ Lợi
 
Ky thuatkhudequy
Ky thuatkhudequyKy thuatkhudequy
Ky thuatkhudequyHồ Lợi
 
Itt epc assignment
Itt epc assignmentItt epc assignment
Itt epc assignmentHồ Lợi
 
Huong danontapc
Huong danontapcHuong danontapc
Huong danontapcHồ Lợi
 
H hai epc_baitap
H hai epc_baitapH hai epc_baitap
H hai epc_baitapHồ Lợi
 
Giaotrinhbaitapkythuatlaptrinh
GiaotrinhbaitapkythuatlaptrinhGiaotrinhbaitapkythuatlaptrinh
GiaotrinhbaitapkythuatlaptrinhHồ Lợi
 
Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2Hồ Lợi
 
Giao trinh c c++
Giao trinh c c++Giao trinh c c++
Giao trinh c c++Hồ Lợi
 
Epc assignment
Epc assignmentEpc assignment
Epc assignmentHồ Lợi
 
Epc test practical
Epc test practicalEpc test practical
Epc test practicalHồ Lợi
 
De thic++ --th
De thic++ --thDe thic++ --th
De thic++ --thHồ Lợi
 

More from Hồ Lợi (20)

Xu ly chuoi
Xu ly chuoiXu ly chuoi
Xu ly chuoi
 
Tóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của cTóm tắt các hàm chuẩn của c
Tóm tắt các hàm chuẩn của c
 
T4
T4T4
T4
 
Nguyen lyoop
Nguyen lyoopNguyen lyoop
Nguyen lyoop
 
Lect04 functions
Lect04 functionsLect04 functions
Lect04 functions
 
Ky thuatkhudequy
Ky thuatkhudequyKy thuatkhudequy
Ky thuatkhudequy
 
Itt epc assignment
Itt epc assignmentItt epc assignment
Itt epc assignment
 
Huong danontapc
Huong danontapcHuong danontapc
Huong danontapc
 
H hai epc_baitap
H hai epc_baitapH hai epc_baitap
H hai epc_baitap
 
Gtrinh oop
Gtrinh oopGtrinh oop
Gtrinh oop
 
Giaotrinhbaitapkythuatlaptrinh
GiaotrinhbaitapkythuatlaptrinhGiaotrinhbaitapkythuatlaptrinh
Giaotrinhbaitapkythuatlaptrinh
 
Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2Giao trinh ky thuat lap trinh 2
Giao trinh ky thuat lap trinh 2
 
Giao trinh c c++
Giao trinh c c++Giao trinh c c++
Giao trinh c c++
 
File trong c_
File trong c_File trong c_
File trong c_
 
Epc assignment
Epc assignmentEpc assignment
Epc assignment
 
Epc test practical
Epc test practicalEpc test practical
Epc test practical
 
De thic++ --th
De thic++ --thDe thic++ --th
De thic++ --th
 
Dethi c++ -lt
Dethi c++ -ltDethi c++ -lt
Dethi c++ -lt
 
Debug trong c
Debug trong cDebug trong c
Debug trong c
 
D05 stl
D05 stlD05 stl
D05 stl
 

Bo sung

  • 1. 1 Bài toán đổi tiền xu Phát biểu: Giả sử có các mệnh giá tiền xu là x1, x2, …, xk. Tìm số lượng đồng tiền xu nhỏ nhất để có thể đổi n xu. Cho rằng, đồng xu có mệnh giá nhỏ nhất là 1 xu để đảm bảo luôn có lời giải. Giải thuật moneyChange(coins[1..k], money) { minCoins = money; for (i = 1; i  k; i++) if (coins[i] == money) return 1; for (i = 1; i  money / 2; i++) { tmpSum = moneyChange(coins, i) + moneyChange(coins, money - i); if (tmpSum < minCoins) minCoins = tmpSum; } return minCoins; }
  • 2. 2 Giảm để trị Tính an Chia để trị: Giảm để trị: Bài toán đổi tiền xu Giải thuật moneyChange(coins[1..k], money) { minCoins = money; for (i = 1; i  k; i++) if (coins[i] == money) return 1; for (i = 1; i  k; i++) if (money > coins[i]) { tmpSum = 1 + moneyChange(coins, money - coins[i]); if (tmpSum < minCoins) minCoins = tmpSum; } return minCoins; }
  • 3. 3 Vấn đề chọn Phát biểu: Tìm phần tử nhỏ thứ k trong dãy S = {s1, s2, …, sn}, với k [1, n]. Chọn (ngẫu nhiên) phần tử pivot thuộc dãy S và tách S thành 3 dãy con: – Sleft: chứa các phần tử nhỏ hơn pivot. – Spivot: chứa các phần tử bằng pivot. – Sright: chứa các phần tử lớn hơn pivot. với chi phí tuyến tính. Giải thuật xử lý như sau: – Nếu k  |Sleft|: Tìm kiếm phần tử nhỏ thứ k trong dãy Sleft. – Nếu |Sleft| < k  |Sleft| + |Spivot|: pivot chính là giá trị nhỏ thứ k cần tìm. – Nếu |Sleft| + |Spivot| < k: Tìm kiếm phần tử nhỏ thứ k – (|Sleft| + |Spivot|) trong dãy Sright. Cài đặt không sử dụng mảng phụ Sau một phép phân hoạch với pivot là phần tử chốt, ta có được pos là vị trí của pivot trong S. Nhận thấy: – Nếu pos = k: pivot chính là phần tử nhỏ thứ k trong dãy. – Nếu pos > k: phần tử nhỏ thứ k thuộc về Sleft = {s1, …, spos–1}. – Nếu pos < k: phần tử nhỏ thứ k thuộc về Sright = {spos+1 , …, sn}. Giải thuật Selection(S[1..n], lower, upper, k) { index = random(lower, upper); pos = Partition(S, lower, upper, index); // S[pos] = pivot if (pos == k) return S[pos]; if (pos > k) Selection(S, lower, pos – 1, k); if (pos < k) Selection(S, pos + 1, upper, k); } Partition(S, lower, upper, pos) { pivot = S[pos]; S[lower]  S[pos]; pos = lower; for (i = lower + 1; i  upper; i++) if (pivot > S[i]) { pos++; S[i]  S[pos]; } S[lower]  S[pos]; return pos; }