Muốn đổi một lượng tiền M đơn vị.. Hỏi phải đổi như thế nào để có số tờ tiền là ít nhất.. Gọi minD[I] là số lượng tờ tiền ít nhất để trả số tiền I, như vậy bài toán yêu cầu chúng ta xác
Trang 1Bài toán Đổi tiền: Giả sử trong kho bạc có N loại tiền có mệnh giá lần lượt là
D[1], D[2], , D[N] đơn vị Muốn đổi một lượng tiền M đơn vị Hỏi phải đổi như thế nào để có số tờ tiền là ít nhất
Dữ liệu vào:
Nhâp vao 2 so N, M
Nhập vào N số : D[1], D[2],…,D[n]
Gọi minD[I] là số lượng tờ tiền ít nhất để trả số tiền I, như vậy bài toán yêu cầu chúng
ta xác định minD[M] Ta nhận thấy rằng để được số tiền là I thì chúng ta sẽ có các cách để tạo thành số tiền đó khi chúng ta thêm một tờ là:
I-D[K1], I-D[K2],…, I-D[KJ], trong đó KJ là số thỏa mãn mà D[KJ]<I Vậy số tiền tối ưu nhất là chúng ta cần tìm thấy trong các minD[I-D[K1]]+1, minD[I-D[K2]]+1,
… , minD[I-D[KJ]]+1 Có công thức quy hoạch động như sau:
minD[I]:=Min(minD[I-D[J]]+1), J thỏa mãn: D[J]<I
Từ đó chúng ta có thủ tục quy hoạch động như sau:
quyHoachDong{
minD[0]:=0;
for(int I=1;i<=M;i++){
Min:=maxint;
If ((minD[I-D[J])+1< Min) && (D[J]<I){
Min:=minD[I-D[J]]+1;
Luu[I]:=J;
} minD[I]:=Min;
}
}
Trong đó mảng Luu là mảng chứa các loại tiền nào cần dùng cuối cùng để đến số tiền
I Như vậy chúng ta có cách để tìm lại các loại tiền cần dùng bằng mảng Luu như sau:
Trang 2I:=M;
While(J!=0){
Printf(D[J]); I:=I-J;
J:=Luu[i]; }