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);
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)
{
}
}
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
{
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
; }
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgpjbGFzcyBJZGVvbmUKewogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKICAgIHsKICAgICAgICB0cnkoU2Nhbm5lciBpbiA9IG5ldyBTY2FubmVyKFN5c3RlbS5pbikpCiAgICAgICAgewogICAgICAgICAgICB3aGlsZSh0cnVlKQogICAgICAgICAgICB7CiAgICAgICAgCQlTeXN0ZW0ub3V0LnByaW50ZigiV2VpZ2h0IG9mIENvaW5zIChncmFtKSA6ICIpOwogICAgICAgICAgICAJaWYgKCFpbi5oYXNOZXh0RG91YmxlKCkpIGJyZWFrOwogICAgICAgICAgICAJbihpbi5uZXh0RG91YmxlKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHN0YXRpYyB2b2lkIG4oZG91YmxlIHRhcmdldCkKICAgIHsKICAgICAgICBBcnJheUxpc3Q8Q29pblNldD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxDb2luU2V0PigpOwogICAgICAgIG4odGFyZ2V0LCBuZXcgaW50W0NvaW4uY291bnRdLCAwLCAwLCAwLCByZXN1bHQpOwogICAgICAgIHJlc3VsdC5zb3J0KENvbXBhcmF0b3IuY29tcGFyaW5nKHggLT4geC52YWx1ZSkpOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiJW5Db2luIFdlaWdodCAgICA6ICVmIGclbiIsIHRhcmdldCk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIk51bWJlciBvZiBMaXN0IDogJWQlbiIsIHJlc3VsdC5zaXplKCkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJhbW91bnQoeWVuKSA6ICAgMXllbiAgIDV5ZW4gIDEweWVuICA1MHllbiAxMDB5ZW4gNTAweWVuJW4iKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJW4iKTsKICAgICAgICBmb3IoQ29pblNldCBzZXQgOiByZXN1bHQpCiAgICAgICAgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2V0KTsKICAgICAgICB9CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CiAgICB9CgogICAgc3RhdGljIGNsYXNzIENvaW4KICAgIHsKICAgICAgICBzdGF0aWMgaW50IGNvdW50OwogICAgICAgIHN0YXRpYyBDb2luW10gbGlzdCA9CiAgICAgICAgewogICAgICAgICAgICAgICAgbmV3IENvaW4oMSwgMS4wRCksCiAgICAgICAgICAgICAgICBuZXcgQ29pbig1LCAzLjdEKSwKICAgICAgICAgICAgICAgIG5ldyBDb2luKDEwLCA0LjVEKSwKICAgICAgICAgICAgICAgIG5ldyBDb2luKDUwLCA0LjBEKSwKICAgICAgICAgICAgICAgIG5ldyBDb2luKDEwMCwgNC44RCksCiAgICAgICAgICAgICAgICBuZXcgQ29pbig1MDAsIDcuMEQpLAogICAgICAgIH07CgogICAgICAgIGZpbmFsIGludCBpZDsKICAgICAgICBmaW5hbCBpbnQgdmFsdWU7CiAgICAgICAgZmluYWwgZG91YmxlIHdlaWdodDsKCiAgICAgICAgQ29pbihpbnQgdmFsdWUsIGRvdWJsZSB3ZWlnaHQpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLmlkID0gY291bnQrKzsKICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgICAgICAgICB0aGlzLndlaWdodCA9IHdlaWdodDsKICAgICAgICB9CiAgICB9CgogICAgc3RhdGljIGNsYXNzIENvaW5TZXQKICAgIHsKICAgICAgICBpbnRbXSBudW07CiAgICAgICAgaW50IHZhbHVlOwogICAgICAgIGRvdWJsZSB3ZWlnaHQ7CgogICAgICAgIENvaW5TZXQoaW50W10gbnVtKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5udW0gPSBBcnJheXMuY29weU9mKG51bSwgQ29pbi5jb3VudCk7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ29pbi5jb3VudDsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YWx1ZSArPSBDb2luLmxpc3RbaV0udmFsdWUgKiBudW1baV07CiAgICAgICAgICAgICAgICB3ZWlnaHQgKz0gQ29pbi5saXN0W2ldLndlaWdodCAqIG51bVtpXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiICUxMGQgOiAlNmQgJTZkICU2ZCAlNmQgJTZkICU2ZCIsIHZhbHVlLCBudW1bMF0sIG51bVsxXSwgbnVtWzJdLCBudW1bM10sIG51bVs0XSwgbnVtWzVdKTsKICAgICAgICB9CiAgICB9CgogICAgc3RhdGljIHZvaWQgbihkb3VibGUgdGFyZ2V0LCBpbnRbXSBudW0sIGludCBrLCBpbnQgdmFsdWUsIGRvdWJsZSB3ZWlnaHQsIEFycmF5TGlzdDxDb2luU2V0PiByZXN1bHRTZXQpCiAgICB7CiAgICAgICAgaWYgKGVwc2lsb25FcXVhbHMod2VpZ2h0LCB0YXJnZXQsIDAuMDAxKSkKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdFNldC5hZGQobmV3IENvaW5TZXQobnVtKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAod2VpZ2h0ID49IHRhcmdldCkgcmV0dXJuOwogICAgICAgIGZvciAoaW50IGkgPSBrOyBpIDwgQ29pbi5jb3VudDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgbnVtW2ldKys7CiAgICAgICAgICAgIG4odGFyZ2V0LCBudW0sIGksIHZhbHVlICsgQ29pbi5saXN0W2ldLnZhbHVlLCB3ZWlnaHQgKyBDb2luLmxpc3RbaV0ud2VpZ2h0LCByZXN1bHRTZXQpOwogICAgICAgICAgICBudW1baV0tLTsKICAgICAgICB9CiAgICB9CgogICAgc3RhdGljIGJvb2xlYW4gZXBzaWxvbkVxdWFscyhkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSBlcHNpbG9uKQogICAgewogICAgICAgIHJldHVybiBNYXRoLmFicyhhIC0gYikgPD0gZXBzaWxvbjsKICAgIH0KfQo=