#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
ostream &operator<<(ostream &os, vector<int> &v)
{
for (int &x : v) os << (&x == &v[0] ? "[" : ", ") << x;
return os << "]";
}
void solve(vector<int> &v, int S)
{
cout << "入力" << endl;
cout << "硬貨: " << v << endl;
cout << "金額: " << S << endl << endl;
int m = *max_element(v.begin(), v.end());
vector<int> N(4 * m, INT_MAX);
N[0] = 0;
int c = 0, q = 0;
for (int i = 0; i < S; i++) {
if (i > m) {
N[i] == N[i - m] + 1 ? c++ : c = 0;
if (c == m) {
q = (S - i) / m + 1;
break;
}
}
if (i + m >= N.size()) N.resize(N.size() + 4 * m, INT_MAX);
if (N[i] != INT_MAX) for (int j : v) N[i + j] = min(N[i + j], N[i] + 1);
}
int n = N[S - q * m];
cout << "出力" << endl;
cout << "使用枚数: " << (n == INT_MAX ? -1 : n + q) << endl << endl << endl;
}
vector<int> V[] = {{1, 7, 10}, {3, 7, 10}, {10, 19, 23, 47, 101}};
int main(void)
{
for (auto &v : V) solve(v, 123456789);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y2xpbWl0cz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpvc3RyZWFtICZvcGVyYXRvcjw8KG9zdHJlYW0gJm9zLCB2ZWN0b3I8aW50PiAmdikKewogICAgZm9yIChpbnQgJnggOiB2KSBvcyA8PCAoJnggPT0gJnZbMF0gPyAiWyIgOiAiLCAiKSA8PCB4OwogICAgcmV0dXJuIG9zIDw8ICJdIjsKfQoKdm9pZCBzb2x2ZSh2ZWN0b3I8aW50PiAmdiwgaW50IFMpCnsKICAgIGNvdXQgPDwgIuWFpeWKmyIgPDwgZW5kbDsKICAgIGNvdXQgPDwgIuehrOiyqDogIiA8PCB2IDw8IGVuZGw7CiAgICBjb3V0IDw8ICLph5HpoY06ICIgPDwgUyA8PCBlbmRsIDw8IGVuZGw7CgogICAgaW50IG0gPSAqbWF4X2VsZW1lbnQodi5iZWdpbigpLCB2LmVuZCgpKTsKICAgIHZlY3RvcjxpbnQ+IE4oNCAqIG0sIElOVF9NQVgpOwogICAgTlswXSA9IDA7CgogICAgaW50IGMgPSAwLCBxID0gMDsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IFM7IGkrKykgewogICAgICAgIGlmIChpID4gbSkgewogICAgICAgICAgICBOW2ldID09IE5baSAtIG1dICsgMSA/IGMrKyA6IGMgPSAwOwogICAgICAgICAgICBpZiAoYyA9PSBtKSB7CiAgICAgICAgICAgICAgICBxID0gKFMgLSBpKSAvIG0gKyAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChpICsgbSA+PSBOLnNpemUoKSkgTi5yZXNpemUoTi5zaXplKCkgKyA0ICogbSwgSU5UX01BWCk7CgogICAgICAgIGlmIChOW2ldICE9IElOVF9NQVgpIGZvciAoaW50IGogOiB2KSBOW2kgKyBqXSA9IG1pbihOW2kgKyBqXSwgTltpXSArIDEpOwogICAgfQoKICAgIGludCBuID0gTltTIC0gcSAqIG1dOwogICAgY291dCA8PCAi5Ye65YqbIiA8PCBlbmRsOwogICAgY291dCA8PCAi5L2/55So5p6a5pWwOiAiIDw8IChuID09IElOVF9NQVggPyAtMSA6IG4gKyBxKSA8PCBlbmRsIDw8IGVuZGwgPDwgZW5kbDsKfQoKdmVjdG9yPGludD4gVltdID0ge3sxLCA3LCAxMH0sIHszLCA3LCAxMH0sIHsxMCwgMTksIDIzLCA0NywgMTAxfX07CgppbnQgbWFpbih2b2lkKQp7CiAgICBmb3IgKGF1dG8gJnYgOiBWKSBzb2x2ZSh2LCAxMjM0NTY3ODkpOwogICAgcmV0dXJuIDA7Cn0=
入力
硬貨: [1, 7, 10]
金額: 123456789
出力
使用枚数: 12345681
入力
硬貨: [3, 7, 10]
金額: 123456789
出力
使用枚数: 12345681
入力
硬貨: [10, 19, 23, 47, 101]
金額: 123456789
出力
使用枚数: 1222348