그냥 그리디하게 해주면 됩니다.

정답 코드 (Assembly):

section .rodata
    d_in_: db " %d",0
    q_in_: db " %lld",0
    s_in_: db " %s",0
    d_out_ln: db "%d",10,0
    q_out_ln: db "%lld",10,0
    s_out_: db "%s",0
    c_out_: db "%c",0

section .data
    d_in_val_: dd 0
    q_in_val_: dq 0

; dget address
%macro dget 1
    mov rdi, d_in_
    mov rsi, %1
    xor rax, rax
    call scanf
%endmacro

; == dget &eax
%macro dget 0
    mov rdi, d_in_
    mov rsi, d_in_val_
    xor rax, rax
    call scanf
    mov eax, [d_in_val_]
%endmacro

%macro sget 1
    mov rdi, s_in_
    mov rsi, %1
    xor rax, rax
    call scanf
%endmacro

; qget address
%macro qget 1
    mov rdi, q_in_
    mov rsi, %1
    xor rax, rax
    call scanf
%endmacro

; == qget rax
%macro qget 0
    mov rdi, q_in_
    mov rsi, q_in_val_
    xor rax, rax
    call scanf
    mov rax, [q_in_val_]
%endmacro

%macro putc 1
    mov rdi, c_out_
    mov sil, %1
    xor rax, rax
    call printf
%endmacro

%macro sprint 1
    mov rdi, s_out_
    mov rsi, %1
    xor rax, rax
    call printf
%endmacro

; dprintln value
%macro dprintln 1
    mov rdi, d_out_ln
    mov esi, %1
    xor rax, rax
    call printf
%endmacro

; == dprintln eax
%macro dprintln 0
    dprintln eax
%endmacro

; qprintln value
%macro qprintln 1
    mov rdi, q_out_ln
    mov rsi, %1
    xor rax, rax
    call printf
%endmacro

%macro qprintln 0
    qprintln rax
%endmacro

; uses r11 to add
%macro addd 2
    mov r11, %1
    add r11, %2
    mov %1, r11
%endmacro

%macro open 0
    push rbp
    mov rbp, rsp
%endmacro

%macro open 1
    push rbp
    mov rbp, rsp
    sub rsp, %1
%endmacro

%macro close 0
    leave
    ret
%endmacro

%macro terminate 0
    xor rax, rax
    leave
    ret
%endmacro

%macro terminate 1
    mov rax, %1
    leave
    ret
%endmacro

section .text
    global main
    extern scanf
    extern printf
    extern strcmp

section .data
    a: dq 0
    b: dq 0
    x: dq 0
    y: dq 0

    i: dd 0
    j: dd 0
    k: dd 0
    l: dd 0

    c: db 0

    s: times 100 db 0
    s1: times 100 db 0
    s2: times 100 db 0

    output: db "Case %lld: %s, %s",10,0

section .text

main:
    open

    xor r12, r12 ;ans
    qget
    mov rdx, rax
    mov rax, 1000
    sub rax, rdx

%macro f 1
    xor rdx, rdx
    mov rcx, %1
    div rcx
    add r12, rax
    mov rax, rdx
%endmacro

    f 500
    f 100
    f 50
    f 10
    f 5
    f 1

    qprintln r12

    terminate

어셈블리는 재미있습니다. 감사합니다.