Công thức tính số tờ tiền

Liên hệ QC

NHGiang

Thành viên mới
Tham gia
21/9/07
Bài viết
6
Được thích
0
Chào cả nhà. Mình đang phải chia lương cho moi người trong công ty. Có cách nào để tính được loại tiền nào cần bao nhiều tờ để thuận lợi cho việc chia lương không nhỉ. Mong mọi người chỉ giáo.
VD: Tổng lương là: 1.024.000 chia cho hai người là 752.000 và 272.000 thì tính ra được số tờ tối ưu là 9 tờ 100,000; 2 tờ 50,000; 1 tờ 20,000 và 2 tờ 2,000.
Nhờ cả nhà giúp mình nhe! Cảm ơn.
 
Chào cả nhà. Mình đang phải chia lương cho moi người trong công ty. Có cách nào để tính được loại tiền nào cần bao nhiều tờ để thuận lợi cho việc chia lương không nhỉ. Mong mọi người chỉ giáo.
VD: Tổng lương là: 1.024.000 chia cho hai người là 752.000 và 272.000 thì tính ra được số tờ tối ưu là 9 tờ 100,000; 2 tờ 50,000; 1 tờ 20,000 và 2 tờ 2,000.

Theo mình, muốn giải quyết vấn đề trên thì cần tìm nghiệm nguyên dương của phương trình vô định sau đây:
100X1 + 50X2 + 20X3 + 2X4 = 1024 (PT đã giản ước: chia 2 vế cho 1000)

Với X1 là số tờ có mệnh giá 100.000 đ
X2 là số tờ có mệnh giá 50.000 đ
X3 là số tờ có mệnh giá 20.000 đ
X4 là số tờ có mệnh giá 2.000 đ
Ngoài ra, trên thực tế còn có nhiều loại tiền có mệnh giá khác nữa (500.000đ, 200.000đ, 1.000đ), nhưng với số lượng như bạn đã nêu thì cũng khá phức tạp rồi.
 
Một cách còn hơi thô & xài hàm mảng, như sau

Mã:
Option Explicit:                Option Base 1
[B]Function ToTien(SoTien As Double) As Variant[/B]
 '500; 200; 100; 50; 20; 10; 5; 2; 1
 If SoTien / 1000 > SoTien \ 1000 Then
 Else
    SoTien = SoTien \ 1000:             Dim SoChia, jJ As Byte
    ReDim SoTo(1, 9) As Byte
 End If
 For jJ = 1 To 9
    SoTo(1, jJ) = 0
    SoChia = Choose(jJ, 500, 200, 100, 50, 20, 10, 5, 2, 1)
    SoTo(1, jJ) = SoTien \ SoChia
    SoTien = SoTien Mod SoChia
 Next
 ToTien = SoTo
[B]End Function[/B]
Và dưới đây là kết quả:
|A|B|C|D|E|F|G|H|I|J
| SoTien |500.000|200.000|100.000|50.000|20.000|10.000|5.000|2.000|1.000
|1.250.000|2|1|0|1|0|0|0|0|0
|1.605.000|3|0|1|0|0|0|1|0|0
|1.960.000|3|2|0|1|0|1|0|0|0
|2.315.000|4|1|1|0|0|1|1|0|0
|73.000|0|0|0|1|1|0|0|1|1
|3.025.000|6|0|0|0|1|0|1|0|0
|3.381.000|6|1|1|1|1|1|0|0|1
|8.135.000|16|0|1|0|1|1|1|0|0
|9.099.000|18|0|0|1|2|0|1|2|0
|6.789.000|13|1|0|1|1|1|1|2|0
Chú í: Muốn có kết quả của hàm chỉ ra số tờ tiền của [A2]=1.250.000 ta phải chọn tất thảy 9 ô trong hàng từ [B2], Sau khi nhập tên hàm & địa chỉ iêu cầu, ta phải kết thúc bằng tổ hợp 3 fím

Hàm chỉ viết cho số tiền chẵn từ ngàn đồng trở lên; Muốn có tờ mệnh giá nhỏ hơn hãy tự thử sức hay iêu cầu thêm!

Chúc xuân vui vẽ!
 
Nếu chia cho 1 người thôi thì chẳng vấn đề gì! Nhưng chia cho 2 - 3 - 4 người thì sao?
Em đã chỉnh lại 1 chút trong code nhưng xem ra không vừa ý lắm.
Mọi người xem file nha!
PHP:
Option Explicit:                Option Base 1
Function ToTien(SoTien As Double, Optional Luot As Integer = 2) As Variant
 ''500; 200; 100; 50; 20; 10; 5; 2; 1
 Dim SoChia As Integer, jJ As Byte
 ReDim SoTo(1, 10) As Byte
 SoTo(1, 10) = (SoTien / 1000) Mod Luot
 SoTien = SoTien \ (1000 * Luot)
 
 For jJ = 1 To 9
    SoTo(1, jJ) = 0
    SoChia = Choose(jJ, 500, 200, 100, 50, 20, 10, 5, 2, 1)
    SoTo(1, jJ) = (SoTien \ SoChia) * Luot
    SoTien = SoTien Mod SoChia
 Next
 
 ToTien = SoTo
End Function
Thân.
 

File đính kèm

  • Chia Tien.rar
    9.2 KB · Đọc: 581
Mã:
Option Explicit:                Option Base 1
[B]Function ToTien(SoTien As Double) As Variant[/B]
 '500; 200; 100; 50; 20; 10; 5; 2; 1
 If SoTien / 1000 > SoTien \ 1000 Then
 Else
    SoTien = SoTien \ 1000:             Dim SoChia, jJ As Byte
    ReDim SoTo(1, 9) As Byte
 End If
 For jJ = 1 To 9
    SoTo(1, jJ) = 0
    SoChia = Choose(jJ, 500, 200, 100, 50, 20, 10, 5, 2, 1)
    SoTo(1, jJ) = SoTien \ SoChia
    SoTien = SoTien Mod SoChia
 Next
 ToTien = SoTo
[B]End Function[/B]
Và dưới đây là kết quả:


Chúc xuân vui vẽ!

Bài này không cần VBA đâu

Dùng chức năng Solver là đủ và nhanh nữa

Nếu dùng VBA thì cũng chỉ là tự động cho solve là được nhanh hơn
.
 
Cách 1:
Dùng bảng liệt kê số tiền lãnh, mệnh giá tiền (xếp thứ tự từ mệnh giá từ lớn đến nhỏ). Hàm TienPhat sẽ tính số tờ phải trả cho từng mệnh giá.
|
A​
|
B​
|
C​
|
D​
|
E​
|
F​
|
G​
|
H​
|
I​
|
J​
|
K​
|
L​
|
M​
|
1​
|
Bảng kê​
|||
2​
|
SoTien​
|
500000​
|
200000​
|
100000​
|
50000​
|
20000​
|
10000​
|
5000​
|
2000​
|
1000​
|
500​
|
200​
|
100​
|
3​
|
2.345.100​
|
4​
|
1​
|
1​
|
0​
|
2​
|
0​
|
1​
|
0​
|
0​
|
0​
|
0​
|
1​
|
4​
|
600.000​
|
1​
|
0​
|
1​
|
0​
|
0​
|
0​
|
0​
|
0​
|
0​
|
0​
|
0​
|
0​
|
5​
|
1.960.000​
|
3​
|
2​
|
0​
|
1​
|
0​
|
1​
|
0​
|
0​
|
0​
|
0​
|
0​
|
0​
|
6​
|
2.315.000​
|
4​
|
1​
|
1​
|
0​
|
0​
|
1​
|
1​
|
0​
|
0​
|
0​
|
0​
|
0​
|
7​
|
73.000​
|
0​
|
0​
|
0​
|
1​
|
1​
|
0​
|
0​
|
1​
|
1​
|
0​
|
0​
|
0​
|
8​
|
3.025.000​
|
6​
|
0​
|
0​
|
0​
|
1​
|
0​
|
1​
|
0​
|
0​
|
0​
|
0​
|
0​
|
9​
|
3.381.000​
|
6​
|
1​
|
1​
|
1​
|
1​
|
1​
|
0​
|
0​
|
1​
|
0​
|
0​
|
0​
|
10​
|
8.135.000​
|
16​
|
0​
|
1​
|
0​
|
1​
|
1​
|
1​
|
0​
|
0​
|
0​
|
0​
|
0​
|
11​
|
9.099.000​
|
18​
|
0​
|
0​
|
1​
|
2​
|
0​
|
1​
|
2​
|
0​
|
0​
|
0​
|
0​
|
12​
|
6.789.000​
|
13​
|
1​
|
0​
|
1​
|
1​
|
1​
|
1​
|
2​
|
0​
|
0​
|
0​
|
0​
|
Công thức tại B2:=tienphat($A3;B$2;$B$2:$I$2)
Mã:
Function TienPhat(SoTien As Long, LoaiTien As Long, RgTien As Range) As Long
Dim iTien As Long, i As Long
For i = 1 To RgTien.Cells.Count
  iTien = Application.WorksheetFunction.Index(RgTien, i)
  TienPhat = SoTien \ iTien
  If iTien = LoaiTien Then Exit For
  SoTien = SoTien - iTien * TienPhat
Next
End Function
Hàm có 3 đối số:
SoTien: số tiền phải phát
LoaiTien: mệnh giá tiền phát
RgTien: vùng chứa các loại tiền phát
Chú ý: có thể số tiền phát thấp hơn số tiền thực lãnh do khai báo mệnh giá thiếu

Cách 2:

Dùng cho bảng in số tờ theo từng mệnh giá phải trả, dùng hàm PhatTien.
[
|
A​
|
B​
|
C​
|
1​
||
Số tiền​
|
Liệt kê từng mệnh giá​
|
2​
|Trường hợp 1|
2.345.050​
|2.345.050 ≈ 2.345.000 = 500.000x4 + 500.000x1 + 500.000x1 + 500.000x2 + 500.000x1|
3​
|Trường hợp 2|
600.000​
|600.000 = 500.000x1 + 500.000x1|

Trường hợp 1: số tiền phát > số tiền lãnh
Trường hợp 2: số tiền phát = số tiền lãnh

Mã:
Function PhatTien(SoTien As Long) As String
Dim Tien As Long, soDu As Long, n As Long, nTo As Long
Tien = SoTien
varTien = Array(500000, 200000, 100000, 50000, 20000, 10000, 5000, 2000, 1000, 500, 200)
soDu = SoTien Mod (varTien(UBound(varTien)))
If soDu > 0 Then
  PhatTien = Format(SoTien, "#,##0") & " " & ChrW(8776) & " " & Format(SoTien - soDu, "#,##0") & " = "
Else
  PhatTien = Format(SoTien, "#,##0") & " = "
End If
For n = 0 To UBound(varTien)
  nTo = Tien \ varTien(n)
  If nTo > 0 Then
    PhatTien = PhatTien & Format(varTien(i), "#,##0") & "x" & nTo & " + "
    Tien = Tien - (varTien(n) * nTo)
  End If
Next
PhatTien = Left(PhatTien, Len(PhatTien) - 3)
End Function
Bạn khai báo mệnh giá trong varTien
Ví dụ 1: mệnh giá nhỏ nhất 1.000
Mã:
 = Array(500000, 200000, 100000, 50000, 20000, 10000, 5000, 2000, 1000)
Ví dụ 2: mệnh giá nhỏ nhất 200
Mã:
 = Array(500000, 200000, 100000, 50000, 20000, 10000, 5000, 2000, 1000, 500, 200)
 
Lần chỉnh sửa cuối:
Anh có thể hướng dẫn kỹ hơn về cách dùng Solver trong bài toán này không? Em cũng đang học về Solver nhưng chưa hiểu lắm! Cảm ơn anh trước!

xem hình sau nhé

Vd_sotien.png


có thể thêm các mệnh giá tiền khác /
hoặc loại nào không có có thể xóa đi - ví dụ không có 200.000 đ thì ta xóa giá trị Ô đó đi

chắc là không khó hiểu,
Kết quả là tối ưu số tờ tiền trả
 

File đính kèm

  • Vd_sotien.png
    Vd_sotien.png
    66.2 KB · Đọc: 323
Lần chỉnh sửa cuối:

File đính kèm

  • Vd_sotien.zip
    18.9 KB · Đọc: 323
Lần chỉnh sửa cuối:
Quả là tiện lợi nhưng hơi khó thiết lập tham số cho solver, mới mờ mờ hiểu thôi, các bác có kinh nghiệm gì không?
Nếu gõ sai số tiền ở ô C1 (chẳng hạn 12,500,500 mà ko có liệt kê mệnh giá tiền nhỏ hơn 500) Solver chạy cả ngày luôn.
 
Quả là tiện lợi nhưng hơi khó thiết lập tham số cho solver, mới mờ mờ hiểu thôi, các bác có kinh nghiệm gì không?
Nếu gõ sai số tiền ở ô C1 (chẳng hạn 12,500,500 mà ko có liệt kê mệnh giá tiền nhỏ hơn 500) Solver chạy cả ngày luôn.


Thực ra có cách (dĩ nhiên khi đó xác định trả thiếu hoặc dư): DOSNET thay đổi đ/k = thành điều kiện trong khoảng (+/-)

Bài này có thể làm công thức thuần túy (chắc là mảng) - a ndu... thử sức là được
 
VD: Tổng lương là: 1.024.000 chia cho hai người là 752.000 và 272.000 thì tính ra được số tờ tối ưu là 9 tờ 100,000; 2 tờ 50,000; 1 tờ 20,000 và 2 tờ 2,000.

Tại sao số tờ tối ưu là 9 tờ 100,000 mà không là 1 tở 500,000, 2 tờ 200,000

Nếu bạn chọn "số tờ tối ưu" thì nên dùng nguyên tắc "tham lam": dùng nhiều nhất tờ tiền có mệnh giá cao nhất, số còn lại dùng nhiều nhất tờ tiền có mệnh giá cao tiếp theo, v.v...

Nếu thể hiện trên Excel, với mỗi khoản tiền (trong ví dụ là 2 khoản) ta có các cột mệnh giá tiền từ cao xuống. Sử dụng các hàm INT, MOD để tính số tờ tiền cho từng khoản.

Ví dụ với khoản 752.000, số tờ 500,000 là =INT(752000/500000) (để tiện cho ví dụ sau, ta coi là công thức nhập ở ô B2
số tờ 200,000 là INT(MOD(752.000,500000)/200000)
hoặc INT((752.000 - B2*500000)/200000)

(các con số 500000, 200000 có thể dùng địa chỉ ô)
 
Việc tính chia tờ tối ưu nhất không phải là đối sách.
Còn việc chia số tờ để cho nhiều người mà không có định mức riêng của từng người thì cũng là 1 đáng ngại.

+Nếu ta chia cho 2 người mà biết người A: 752.000 còn người B: 272.000
Thì vấn đề chỉ là tính số tờ tối ưu cho người A và người B thôi.

+Nếu ta chia điều cho 2 người thì sao? Rồi còn 3 người nữa? Vậy sẽ không đều và dư ra đó.
Ở Topic trên em cũng đã đề cập vấn đề này rồi đó.
Thân.
 
Đây là công thức đếm số tờ tiền hay đây !
Mời các bác tham khảo file đính kèm nhé
Nhớ đừng quên cảm ơn mình đấy
Công thức trong file thì hay nhưng không thực tế tí nào!
Ví dụ:
- Tôi lĩnh lương cho 10 công nhân, tổng số tiền = 10 triệu đồng toàn giấy 50 ngàn thì chia làm sao?
Với công thức của bạn nó chia trật lất vì chưa tính đến tổng tiền và số tờ của từng loại tiền hiện đang có
 
Công thức trong file thì hay nhưng không thực tế tí nào!
Ví dụ:
- Tôi lĩnh lương cho 10 công nhân, tổng số tiền = 10 triệu đồng toàn giấy 50 ngàn thì chia làm sao?
Với công thức của bạn nó chia trật lất vì chưa tính đến tổng tiền và số tờ của từng loại tiền hiện đang có


Đâu có gì đâ nè, Nếu bạn không có 500.000 thì bạn xoá cột đó đi và nó sẽ tự nhảy qua cột 200.000 mà

Bạn không có loại tiền nào thì xoá cột đó,
 
Đâu có gì đâ nè, Nếu bạn không có 500.000 thì bạn xoá cột đó đi và nó sẽ tự nhảy qua cột 200.000 mà

Bạn không có loại tiền nào thì xoá cột đó,
Ấy... bạn chưa hiểu ý tôi rồi...
Ý tôi muốn nói công thức trong file của bạn chỉ có thể áp dụng được trong trường hợp quỹ lương của bạn dồi dào đến mức muốn chia ai loại tờ tiền nào cũng được (bạn là ngân hàng chăng?)
Còn như khi bạn lĩnh về thì nó đâu phải vậy ---> Số tiền của từng loại là hạn chế
Bạn phải để ý đến điều này chứ, ví dụ: bạn có 100 tờ 500 ngàn, 20 tờ 200 ngàn, 500 tờ 100 ngàn ---> Khi ấy bạn phải chia theo số tờ bạn đang có ---> Không thể tự do được
 
Ấy... bạn chưa hiểu ý tôi rồi...
Ý tôi muốn nói công thức trong file của bạn chỉ có thể áp dụng được trong trường hợp quỹ lương của bạn dồi dào đến mức muốn chia ai loại tờ tiền nào cũng được (bạn là ngân hàng chăng?)
Còn như khi bạn lĩnh về thì nó đâu phải vậy ---> Số tiền của từng loại là hạn chế
Bạn phải để ý đến điều này chứ, ví dụ: bạn có 100 tờ 500 ngàn, 20 tờ 200 ngàn, 500 tờ 100 ngàn ---> Khi ấy bạn phải chia theo số tờ bạn đang có ---> Không thể tự do được[/quote

Ủa nếu vậy khi lương cần tiền lẻ thì bạn cũng phải lo mà đổi chứ, không lẽ bạn thiếu công nhân được hả

Vd: Lương của công nhân là 6.529.000 đ thì bạn phải làm sao với 29.000 đồng?

Thì căn cứ vào lượng tiền tồn tại quỹ công ty có bạn phân chia cho hợp lý chứ,
Với mức lương là 6.529.000 mà quỹ công ty chỉ có các loại mệnh giá như sao 500.000 10tờ, 200.000 7tờ, 100.000 1tờ, 20.000 1tờ, 5.000 1tờ, 2.000 2tờ ( Căn cứ vào mệnh giá tiền đang có mà phân chia).
Thay vì theo như bảng phân chia tiền của mình là 500.000 13tờ, 20.000 1tờ, 5.000 1tờ, 2.000 2tờ.
 

File đính kèm

  • Đếm Số Tờ Tiền.xls
    93 KB · Đọc: 147
Ấy... bạn chưa hiểu ý tôi rồi...
Ý tôi muốn nói công thức trong file của bạn chỉ có thể áp dụng được trong trường hợp quỹ lương của bạn dồi dào đến mức muốn chia ai loại tờ tiền nào cũng được (bạn là ngân hàng chăng?)
Còn như khi bạn lĩnh về thì nó đâu phải vậy ---> Số tiền của từng loại là hạn chế
Bạn phải để ý đến điều này chứ, ví dụ: bạn có 100 tờ 500 ngàn, 20 tờ 200 ngàn, 500 tờ 100 ngàn ---> Khi ấy bạn phải chia theo số tờ bạn đang có ---> Không thể tự do được[/quote

Ủa nếu vậy khi lương cần tiền lẻ thì bạn cũng phải lo mà đổi chứ, không lẽ bạn thiếu công nhân được hả

Vd: Lương của công nhân là 6.529.000 đ thì bạn phải làm sao với 29.000 đồng?

Thì căn cứ vào lượng tiền tồn tại quỹ công ty có bạn phân chia cho hợp lý chứ,
Với mức lương là 6.529.000 mà quỹ công ty chỉ có các loại mệnh giá như sao 500.000 10tờ, 200.000 7tờ, 100.000 1tờ, 20.000 1tờ, 5.000 1tờ, 2.000 2tờ ( Căn cứ vào mệnh giá tiền đang có mà phân chia).
Thay vì theo như bảng phân chia tiền của mình là 500.000 13tờ, 20.000 1tờ, 5.000 1tờ, 2.000 2tờ.
Đương nhiên với số tờ mà ta lảnh về để chia thì không bao giờ chia chính xác được ---> Ở đây muốn nói đến giải pháp tối ưu nhất, có nghĩa là bạn chia thế nào để ít phải đổi tiền nhất
Chứ còn với số lượng tiền dồi dào, tôi cần gì công thức cho mệt ---> Tôi cứ chia thoải mái
Bài toán này không dể nhai như bạn nghĩ đâu! Nó đã có từ lâu trên GPE rồi, bạn tham khảo tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=6337
 
Đương nhiên với số tờ mà ta lảnh về để chia thì không bao giờ chia chính xác được ---> Ở đây muốn nói đến giải pháp tối ưu nhất, có nghĩa là bạn chia thế nào để ít phải đổi tiền nhất
Chứ còn với số lượng tiền dồi dào, tôi cần gì công thức cho mệt ---> Tôi cứ chia thoải mái
Bài toán này không dể nhai như bạn nghĩ đâu! Nó đã có từ lâu trên GPE rồi, bạn tham khảo tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=6337

ý của ndu96081631 là sau khi làm xong bảng lương ta có thể có được nhu cầu tiền lẻ như thế nào để có kế hoạch khi rút tiền ở ngân hàng vế chi lương ta đổi tiền lẻ luôn, chứ không phải có tiền lẻ rồi mới tính cách chia.??????

Không biết có phải hong nữa....../-*+/
 
Hãy tưởng tượng việc ATM phải làm NTN?

(+) Số tờ tiền hiện có tại thời điểm khi 1 khách hàng bấm Password là hữu hạn;
(+) Nhưng số tiền khách hàng sẽ bấm vô yêu cầu chi trả mỗi lần là loạn xị ngậu.
Vậy phải giải quyết sao đây?
Có lẻ theo kiểu hết nạt vạc đến xương thôi. :-=
 
Web KT
Back
Top Bottom