60 lines
1.4 KiB
Fortran
60 lines
1.4 KiB
Fortran
|
PROGRAM coin_combo
|
||
|
IMPLICIT NONE
|
||
|
CHARACTER(len=10) :: arg
|
||
|
INTEGER :: i, j, num_coins, amount, coin, r
|
||
|
INTEGER, DIMENSION (:), ALLOCATABLE :: coins
|
||
|
INTEGER, DIMENSION (:,:), ALLOCATABLE :: m
|
||
|
|
||
|
num_coins = command_argument_count() - 1
|
||
|
ALLOCATE (coins(num_coins))
|
||
|
|
||
|
CALL get_command_argument(1, arg)
|
||
|
READ (arg, '(I10)') amount
|
||
|
|
||
|
ALLOCATE (m(num_coins + 1, amount + 1))
|
||
|
m(:,:) = 0
|
||
|
m(1, 2:) = 999
|
||
|
|
||
|
DO i = 2, num_coins + 1
|
||
|
CALL get_command_argument(i, arg)
|
||
|
READ (arg, '(I10)') coins(i - 1)
|
||
|
END DO
|
||
|
|
||
|
DO i = 2, num_coins + 1
|
||
|
coin = coins(i - 1)
|
||
|
DO j = 2, amount + 1
|
||
|
r = j - 1
|
||
|
IF (coin == r) THEN
|
||
|
m(i, j) = 1
|
||
|
ELSE IF (coin > r) THEN
|
||
|
m(i, j) = m(i - 1, j)
|
||
|
ELSE
|
||
|
m(i, j) = MIN(m(i - 1, j), 1 + m(i, j - coin))
|
||
|
END IF
|
||
|
END DO
|
||
|
END DO
|
||
|
|
||
|
i = num_coins + 1
|
||
|
r = amount
|
||
|
|
||
|
DO WHILE (r /= 0)
|
||
|
coin = coins(i - 1)
|
||
|
j = r + 1
|
||
|
IF (r >= coin .AND. m(i, j - coin) == m(i, j) - 1) THEN
|
||
|
IF (r == coin) THEN
|
||
|
WRITE (*, '(i3)') coin
|
||
|
ELSE
|
||
|
WRITE (*, '(i3)', advance='no') coin
|
||
|
END IF
|
||
|
r = r - coin
|
||
|
ELSE IF (i > 2) THEN
|
||
|
i = i - 1
|
||
|
ELSE
|
||
|
EXIT
|
||
|
END IF
|
||
|
END DO
|
||
|
|
||
|
DEALLOCATE(coins)
|
||
|
DEALLOCATE(m)
|
||
|
END PROGRAM coin_combo
|