Hỏi thuật toán bài toán tìm tổng số cách đổi tiền có thể được

Ủa đâu anh. Thì ở trên em ghi ko có n- nhưng trong vòng lập ở đằng sau em vẫn để
VD như chạy từ 500k
Thì t1= a*500k
chạy b(200k)
Thì chạy từ 0 cho đến <=n-t1 rồi đó… Là vẫn trừ rồi

giờ mới thấy cái này duyệt trâu 5 vòng for cũng được :joy:

2 Likes

hic tại bí quá mới làm cách đó… Chứ làm là biết chắc là lỗi thời gian xiền :((

break sớm thì ko có lỗi thời gian đâu

2 Likes

cho n = 876 thử coi nó có ra 297933 hay ra số nào?

ý chạy thử thấy t2 t3 t4 tính sai đó. t2 = t1 + bm200, t3 = t2 + cm100, v.v… chứ

1 Like

ra 297933 đúng anh ơi!

sửa lại mấy cái t cho đúng nữa là ra lẹ thôi

1 Like

Cái t ở trên thì ở dưới em vẫn chạy đến n-t(ở trên rồi mà anh nhỉ??) hic…

t2 t3 t4 t5 có nghĩa là gì? Tính t2 = am500 - bm200; phép trừ có đúng ko ??

1 Like

Dạng như đầu tiên là chạy a(biến của 500k)
Thì biến b(của 200k) sẽ chạy đến (số tiền ban đầu - a*500k)/200k
Em hiểu như vậy ko biết đúng ko nhỉ?? Theo lời bác qloved ở trên ấy

đúng rồi, vậy tính t2 t3 t4 lại cho đúng đi

1 Like

:sob:để động não tiếp. Hic

t1 là tổng số tiền trả bằng tờ 500k
t2 là tổng số tiền trả bằng tờ 500k, 200k
t3 là tổng số tiền trả bằng tờ 500k, 200k, 100k
t4 là tổng số tiền trả bằng tờ 500k, 200k, 100k. 50k

tổng thì tính tổng chứ sao lại trừ ~.~
t4 = a*m500 - b*m200 - c*m100 - d*m50; trừ gì ở đây trời ~.~

1 Like

oh sệt! Đã hiểu ra vấn đề ở đây :sob: Cảm ơn anh rất nhiều!

viết lại cho đẹp nè, đâu cần break hay dem++ tá lả, cần 1 cái trong cùng là được rồi @_@ Code kia chạy đúng, đừng copy code này.

int SoCach(int n)
{
    n /= 10000; //n là bội của 10000 nên chia bớt
    int count = 0;
    for (int a = 0; a <= n; a += 50)
    for (int b = a; b <= n; b += 20)
    for (int c = b; c <= n; c += 10)
    for (int d = c; d <= n; d +=  5)
    for (int e = d; e <= n; e +=  2)
        count += e == n;
    return count;
}
2 Likes

Nếu suy nghĩ đơn giản thì 5 loại tiền ứng với 5 vòng while

while (50 * tien500 ≤ n/10000)
{
    int tong1 = 50 * tien500;
    while (tong1 + 200k * tien200 ≤ n/10000)
    {
        int tong2 = tong1 + 20 * tien200;
        while (tong2 + 10 * tien100 ≤ n/10000)
        {
            int tong3 = tong2 + 10 * tien100;
            while (tong3 + 5 * tien50 ≤ n/10000)
            {
                int tong4 = tong3 + 5 * tien50;
                while (tong4 + 2 * tien20 ≤ n/10000)
                {
                    int tong5 = tong4 + 2 * tien20;
                    if (tong5 = n/10000)
                    {
                        blablabla...
                    }
                    tien20++;
                }
                tien50++;
            }
            tien100++;
        }
        tien200++;
    }
    tien500++;
}
1 Like

Thì theo em while vs for cũng như nhau mà nhỉ anh?? :smiley: Lúc đầu em suy nghĩ max đơn giản :smiley: 5 dòng for chạy 1 lần gần 2p :smiley:

1 Like

2.2 giây nhé:

1 Like

quá chậm, chạy trên java hay bị kêu là chậm chạp hơn nhé

2 Likes

Cũng dùng 5 vòng while với winform à O_o

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?