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