import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone
{
    public static void main(String[] args)
    {
        try(Scanner in = new Scanner(System.in))
        {
            while(true)
            {
        		System.out.printf("Weight of Coins (gram) : ");
            	if (!in.hasNextDouble()) break;
            	n(in.nextDouble());
            }
        }
    }

    static void n(double target)
    {
        ArrayList<CoinSet> result = new ArrayList<CoinSet>();
        n(target, new int[Coin.count], 0, 0, 0, result);
        result.sort(Comparator.comparing(x -> x.value));

        System.out.printf("%nCoin Weight    : %f g%n", target);
        System.out.printf("Number of List : %d%n", result.size());
        System.out.printf("amount(yen) :   1yen   5yen  10yen  50yen 100yen 500yen%n");
        System.out.printf("---------------------------------------------------------%n");
        for(CoinSet set : result)
        {
            System.out.println(set);
        }
        System.out.println();
    }

    static class Coin
    {
        static int count;
        static Coin[] list =
        {
                new Coin(1, 1.0D),
                new Coin(5, 3.7D),
                new Coin(10, 4.5D),
                new Coin(50, 4.0D),
                new Coin(100, 4.8D),
                new Coin(500, 7.0D),
        };

        final int id;
        final int value;
        final double weight;

        Coin(int value, double weight)
        {
            this.id = count++;
            this.value = value;
            this.weight = weight;
        }
    }

    static class CoinSet
    {
        int[] num;
        int value;
        double weight;

        CoinSet(int[] num)
        {
            this.num = Arrays.copyOf(num, Coin.count);
            for (int i = 0; i < Coin.count; i++)
            {
                value += Coin.list[i].value * num[i];
                weight += Coin.list[i].weight * num[i];
            }
        }

        @Override
        public String toString()
        {
            return String.format(" %10d : %6d %6d %6d %6d %6d %6d", value, num[0], num[1], num[2], num[3], num[4], num[5]);
        }
    }

    static void n(double target, int[] num, int k, int value, double weight, ArrayList<CoinSet> resultSet)
    {
        if (epsilonEquals(weight, target, 0.001))
        {
            resultSet.add(new CoinSet(num));
        }

        if (weight >= target) return;
        for (int i = k; i < Coin.count; i++)
        {
            num[i]++;
            n(target, num, i, value + Coin.list[i].value, weight + Coin.list[i].weight, resultSet);
            num[i]--;
        }
    }

    static boolean epsilonEquals(double a, double b, double epsilon)
    {
        return Math.abs(a - b) <= epsilon;
    }
}
