import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
static final int COIN_001_WEIGHT = 10;
static final int COIN_005_WEIGHT = 37;
static final int COIN_010_WEIGHT = 45;
static final int COIN_050_WEIGHT = 40;
static final int COIN_100_WEIGHT = 48;
static final int COIN_500_WEIGHT = 70;
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;
search(in.nextDouble());
}
}
}
static class CoinSet
{
int n001, n005, n010, n050, n100, n500;
int amount;
CoinSet(int n001, int n005, int n010, int n050, int n100, int n500)
{
this.n001 = n001;
this.n005 = n005;
this.n010 = n010;
this.n050 = n050;
this.n100 = n100;
this.n500 = n500;
amount = n001 + 5 * n005 + 10 * n010 + 50 * n050 + 100 * n100 + 500 * n500;
}
@Override
{
return String.
format(" %10d : %6d %6d %6d %6d %6d %6d", amount, n001, n005, n010, n050, n100, n500
); }
}
static void search(double g)
{
ArrayList<CoinSet> result = search1((int) (g * 10));
System.
out.
printf("%nCoin Weight : %.1f g%n", g
); System.
out.
printf("Number of List : %d%n", result.
size()); System.
out.
printf("Time : %,dns%n", e
- s
); if (result.size() < 1000)
{
System.
out.
printf("amount(yen) : 1yen 5yen 10yen 50yen 100yen 500yen%n"); System.
out.
printf("---------------------------------------------------------%n"); for(CoinSet set : result)
{
}
}
}
// 残りが1.0g単位になるように探索する
static ArrayList<CoinSet> search1(int remain)
{
ArrayList<CoinSet> result = new ArrayList<CoinSet>();
for(int n005 = 0; n005 <= 9; n005++)
{
remain -= n005 * COIN_005_WEIGHT;
for(int n100 = 0; n100 <= 4; n100++)
{
remain -= n100 * COIN_100_WEIGHT;
for(int n010 = 0; n010 <= 1; n010++)
{
remain -= n010 * COIN_010_WEIGHT;
if (remain >= 0 && remain % 10 == 0)
{
search2(result, remain, n005, n010, n100);
}
remain += n010 * COIN_010_WEIGHT;
}
remain += n100 * COIN_100_WEIGHT;
}
remain += n005 * COIN_005_WEIGHT;
}
return result;
}
// 1g単位で探索する…5重ループよくないwwwwwwww
static void search2(ArrayList<CoinSet> result, int remain, int _n005, int _n010, int _n100)
{
for (int n005 = 0; n005 * COIN_005_WEIGHT <= remain; n005 += 10)
{
remain -= n005 * COIN_005_WEIGHT;
for (int n100 = 0; n100 * COIN_100_WEIGHT <= remain; n100 += 5)
{
remain -= n100 * COIN_100_WEIGHT;
for (int n010 = 0; n010 * COIN_010_WEIGHT <= remain; n010 += 2)
{
remain -= n010 * COIN_010_WEIGHT;
for (int n500 = 0; n500 * COIN_500_WEIGHT <= remain; n500++)
{
remain -= n500 * COIN_500_WEIGHT;
for (int n050 = 0; n050 * COIN_050_WEIGHT <= remain; n050++)
{
remain -= n050 * COIN_050_WEIGHT;
// 1円はあまりで作る
result.add(new CoinSet(remain / 10, n005 + _n005, n010 + _n010, n050, n100 + _n100, n500));
remain += n050 * COIN_050_WEIGHT;
}
remain += n500 * COIN_500_WEIGHT;
}
remain += n010 * COIN_010_WEIGHT;
}
remain += n100 * COIN_100_WEIGHT;
}
remain += n005 * COIN_005_WEIGHT;
}
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgpjbGFzcyBJZGVvbmUKewogICAgc3RhdGljIGZpbmFsIGludCBDT0lOXzAwMV9XRUlHSFQgPSAxMDsKICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09JTl8wMDVfV0VJR0hUID0gMzc7CiAgICBzdGF0aWMgZmluYWwgaW50IENPSU5fMDEwX1dFSUdIVCA9IDQ1OwogICAgc3RhdGljIGZpbmFsIGludCBDT0lOXzA1MF9XRUlHSFQgPSA0MDsKICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09JTl8xMDBfV0VJR0hUID0gNDg7CiAgICBzdGF0aWMgZmluYWwgaW50IENPSU5fNTAwX1dFSUdIVCA9IDcwOwoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCiAgICB7CiAgICAgICAgdHJ5KFNjYW5uZXIgaW4gPSBuZXcgU2Nhbm5lcihTeXN0ZW0uaW4pKQogICAgICAgIHsKICAgICAgICAgICAgd2hpbGUodHJ1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIldlaWdodCBvZiBDb2lucyAoZ3JhbSkgOiAiKTsKICAgICAgICAgICAgICAgIGlmICghaW4uaGFzTmV4dERvdWJsZSgpKSBicmVhazsKICAgICAgICAgICAgICAgIHNlYXJjaChpbi5uZXh0RG91YmxlKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHN0YXRpYyBjbGFzcyBDb2luU2V0CiAgICB7CiAgICAgICAgaW50IG4wMDEsIG4wMDUsIG4wMTAsIG4wNTAsIG4xMDAsIG41MDA7CiAgICAgICAgaW50IGFtb3VudDsKCiAgICAgICAgQ29pblNldChpbnQgbjAwMSwgaW50IG4wMDUsIGludCBuMDEwLCBpbnQgbjA1MCwgaW50IG4xMDAsIGludCBuNTAwKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5uMDAxID0gbjAwMTsKICAgICAgICAgICAgdGhpcy5uMDA1ID0gbjAwNTsKICAgICAgICAgICAgdGhpcy5uMDEwID0gbjAxMDsKICAgICAgICAgICAgdGhpcy5uMDUwID0gbjA1MDsKICAgICAgICAgICAgdGhpcy5uMTAwID0gbjEwMDsKICAgICAgICAgICAgdGhpcy5uNTAwID0gbjUwMDsKICAgICAgICAgICAgYW1vdW50ID0gbjAwMSArIDUgKiBuMDA1ICsgMTAgKiBuMDEwICsgNTAgKiBuMDUwICsgMTAwICogbjEwMCArIDUwMCAqIG41MDA7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIgJTEwZCA6ICU2ZCAlNmQgJTZkICU2ZCAlNmQgJTZkIiwgYW1vdW50LCBuMDAxLCBuMDA1LCBuMDEwLCBuMDUwLCBuMTAwLCBuNTAwKTsKICAgICAgICB9CiAgICB9CgogICAgc3RhdGljIHZvaWQgc2VhcmNoKGRvdWJsZSBnKQogICAgewogICAgICAgIGxvbmcgcyA9IFN5c3RlbS5uYW5vVGltZSgpOwogICAgICAgIEFycmF5TGlzdDxDb2luU2V0PiByZXN1bHQgPSBzZWFyY2gxKChpbnQpIChnICogMTApKTsKICAgICAgICByZXN1bHQuc29ydChDb21wYXJhdG9yLmNvbXBhcmluZyh4IC0+IHguYW1vdW50KSk7CiAgICAgICAgbG9uZyBlID0gU3lzdGVtLm5hbm9UaW1lKCk7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIlbkNvaW4gV2VpZ2h0ICAgIDogJS4xZiBnJW4iLCBnKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiTnVtYmVyIG9mIExpc3QgOiAlZCVuIiwgcmVzdWx0LnNpemUoKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIlRpbWUgICAgICAgICAgIDogJSxkbnMlbiIsIGUgLSBzKTsKICAgICAgICBpZiAocmVzdWx0LnNpemUoKSA8IDEwMDApCiAgICAgICAgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiYW1vdW50KHllbikgOiAgIDF5ZW4gICA1eWVuICAxMHllbiAgNTB5ZW4gMTAweWVuIDUwMHllbiVuIik7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0lbiIpOwogICAgICAgICAgICBmb3IoQ29pblNldCBzZXQgOiByZXN1bHQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgfQoKICAgIC8vIOaui+OCiuOBjDEuMGfljZjkvY3jgavjgarjgovjgojjgYbjgavmjqLntKLjgZnjgosKICAgIHN0YXRpYyBBcnJheUxpc3Q8Q29pblNldD4gc2VhcmNoMShpbnQgcmVtYWluKQogICAgewogICAgICAgIEFycmF5TGlzdDxDb2luU2V0PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PENvaW5TZXQ+KCk7CiAgICAgICAgZm9yKGludCBuMDA1ID0gMDsgbjAwNSA8PSA5OyBuMDA1KyspCiAgICAgICAgewogICAgICAgICAgICByZW1haW4gLT0gbjAwNSAqIENPSU5fMDA1X1dFSUdIVDsKICAgICAgICAgICAgZm9yKGludCBuMTAwID0gMDsgbjEwMCA8PSA0OyBuMTAwKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJlbWFpbiAtPSBuMTAwICogQ09JTl8xMDBfV0VJR0hUOwogICAgICAgICAgICAgICAgZm9yKGludCBuMDEwID0gMDsgbjAxMCA8PSAxOyBuMDEwKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVtYWluIC09IG4wMTAgKiBDT0lOXzAxMF9XRUlHSFQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbiA+PSAwICYmIHJlbWFpbiAlIDEwID09IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2gyKHJlc3VsdCwgcmVtYWluLCBuMDA1LCBuMDEwLCBuMTAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVtYWluICs9IG4wMTAgKiBDT0lOXzAxMF9XRUlHSFQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZW1haW4gKz0gbjEwMCAqIENPSU5fMTAwX1dFSUdIVDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZW1haW4gKz0gbjAwNSAqIENPSU5fMDA1X1dFSUdIVDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvLyAxZ+WNmOS9jeOBp+aOoue0ouOBmeOCi+KApjXph43jg6vjg7zjg5fjgojjgY/jgarjgYTvvZfvvZfvvZfvvZfvvZfvvZfvvZfvvZcKICAgIHN0YXRpYyB2b2lkIHNlYXJjaDIoQXJyYXlMaXN0PENvaW5TZXQ+IHJlc3VsdCwgaW50IHJlbWFpbiwgaW50IF9uMDA1LCBpbnQgX24wMTAsIGludCBfbjEwMCkKICAgIHsKICAgICAgICBmb3IgKGludCBuMDA1ID0gMDsgbjAwNSAqIENPSU5fMDA1X1dFSUdIVCA8PSByZW1haW47IG4wMDUgKz0gMTApCiAgICAgICAgewogICAgICAgICAgICByZW1haW4gLT0gbjAwNSAqIENPSU5fMDA1X1dFSUdIVDsKICAgICAgICAgICAgZm9yIChpbnQgbjEwMCA9IDA7IG4xMDAgKiBDT0lOXzEwMF9XRUlHSFQgPD0gcmVtYWluOyBuMTAwICs9IDUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJlbWFpbiAtPSBuMTAwICogQ09JTl8xMDBfV0VJR0hUOwogICAgICAgICAgICAgICAgZm9yIChpbnQgbjAxMCA9IDA7IG4wMTAgKiBDT0lOXzAxMF9XRUlHSFQgPD0gcmVtYWluOyBuMDEwICs9IDIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVtYWluIC09IG4wMTAgKiBDT0lOXzAxMF9XRUlHSFQ7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbjUwMCA9IDA7IG41MDAgKiBDT0lOXzUwMF9XRUlHSFQgPD0gcmVtYWluOyBuNTAwKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZW1haW4gLT0gbjUwMCAqIENPSU5fNTAwX1dFSUdIVDsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbjA1MCA9IDA7IG4wNTAgKiBDT0lOXzA1MF9XRUlHSFQgPD0gcmVtYWluOyBuMDUwKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbiAtPSBuMDUwICogQ09JTl8wNTBfV0VJR0hUOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDHlhobjga/jgYLjgb7jgorjgafkvZzjgosKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobmV3IENvaW5TZXQocmVtYWluIC8gMTAsIG4wMDUgKyBfbjAwNSwgbjAxMCArIF9uMDEwLCBuMDUwLCBuMTAwICsgX24xMDAsIG41MDApKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW4gKz0gbjA1MCAqIENPSU5fMDUwX1dFSUdIVDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZW1haW4gKz0gbjUwMCAqIENPSU5fNTAwX1dFSUdIVDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVtYWluICs9IG4wMTAgKiBDT0lOXzAxMF9XRUlHSFQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZW1haW4gKz0gbjEwMCAqIENPSU5fMTAwX1dFSUdIVDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZW1haW4gKz0gbjAwNSAqIENPSU5fMDA1X1dFSUdIVDsKICAgICAgICB9CiAgICB9Cn0K