puzzles/coin-combo/coincombo.f90

60 lines
1.4 KiB
Fortran
Raw Normal View History

2024-04-02 21:01:09 +00:00
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