#include <iostream>
#include <vector>
#include <tuple>
#include <limits>
#include <algorithm>
#include <cstdint>
#include <cmath>
#include <iomanip>
typedef std::tuple<std::uint64_t, double> Coin;
typedef std::vector<Coin> Coins;
typedef std::vector<std::uint64_t> DType;
typedef std::vector<DType> RType;
bool DoubleEqual(double a, double b,double Epsilon){
return std::abs(a - b) <= Epsilon;
}
bool AddVector(DType& D, DType& L){
bool Carry = false;
D[0]++;
for (std::size_t i = 0; i < D.size(); i++)
{
if (Carry == true){
D[i]++;
}
Carry = false;
if (D[i] > L[i]){
D[i] = 0;
Carry = true;
}
}
return true;
}
bool CheckWeight(const double& Weight, Coins& C, DType& D){
double Total = 0;
for (std::size_t i = 0; i < C.size(); i++){
Total += std::get<1>(C[i]) * D[i];
}
return DoubleEqual(Weight, Total,0.000000001);
}
RType MakeHoge(double Weight, Coins C){
DType L;
DType D(C.size());
bool F = false;
RType R;
for (auto& o : C){
L.push_back(static_cast<std::uint64_t>(std::ceil(Weight / std::get<1>(o))));
}
while (F == false){
if (CheckWeight(Weight, C, D) == true){
R.push_back(D);
}
AddVector(D, L);
F = true;
for (std::size_t i = 0; i < D.size(); i++)
{
if (D[i] != L[i]){
F = false;
break;
}
}
}
return R;
}
bool Show(const double& Weight, RType R, Coins C){
double Total = 0;
std::cout << "input Weight:" << Weight <<"g"<< std::endl;
std::cout << "have the " << R.size()<<" Lists"<< std::endl;
std::cout << std::setw(10)<<"amount|";
for (auto& o : C){
std::cout << std::setw(5)<<std::get<0>(o);
}
std::cout<<std::endl;
std::sort(R.begin(), R.end(), [&](DType& A, DType& B){
double TotalA = 0;
double TotalB = 0;
for (std::size_t i = 0; i < A.size(); i++)
{
TotalA += A[i] * std::get<0>(C[i]);
}
for (std::size_t i = 0; i < B.size(); i++)
{
TotalB += B[i] * std::get<0>(C[i]);
}
return TotalA < TotalB;
});
for (auto& oo : R){
for (std::size_t i = 0; i < oo.size(); i++)
{
Total += oo[i] * std::get<0>(C[i]);
}
std::cout << std::setw(9) << Total<<"|";
for (auto& o : oo){
std::cout << std::setw(5) << o;
}
std::cout<<std::endl;
Total = 0;
}
return true;
}
int main(){
Coins C{ std::make_tuple(1, 1.0), std::make_tuple(5, 3.7), std::make_tuple(10, 4.5), std::make_tuple(50, 4.0), std::make_tuple(100, 4.8), std::make_tuple(500, 7.0), };
double W = 0;
RType R;
W = 23.7;
R = MakeHoge(W, C);
Show(W, R, C);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDxsaW1pdHM+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxjc3RkaW50PgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxpb21hbmlwPgoKdHlwZWRlZiBzdGQ6OnR1cGxlPHN0ZDo6dWludDY0X3QsIGRvdWJsZT4gQ29pbjsKdHlwZWRlZiBzdGQ6OnZlY3RvcjxDb2luPiBDb2luczsKdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnVpbnQ2NF90PiBEVHlwZTsKdHlwZWRlZiBzdGQ6OnZlY3RvcjxEVHlwZT4gUlR5cGU7Cgpib29sIERvdWJsZUVxdWFsKGRvdWJsZSBhLCBkb3VibGUgYixkb3VibGUgRXBzaWxvbil7CglyZXR1cm4gc3RkOjphYnMoYSAtIGIpIDw9IEVwc2lsb247Cn0KCmJvb2wgQWRkVmVjdG9yKERUeXBlJiBELCBEVHlwZSYgTCl7Cglib29sIENhcnJ5ID0gZmFsc2U7CglEWzBdKys7Cglmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgRC5zaXplKCk7IGkrKykKCXsKCQlpZiAoQ2FycnkgPT0gdHJ1ZSl7CgkJCURbaV0rKzsKCQl9CgkJQ2FycnkgPSBmYWxzZTsKCQlpZiAoRFtpXSA+IExbaV0pewoJCQlEW2ldID0gMDsKCQkJQ2FycnkgPSB0cnVlOwoJCX0KCgl9CglyZXR1cm4gdHJ1ZTsKfQoKYm9vbCBDaGVja1dlaWdodChjb25zdCBkb3VibGUmIFdlaWdodCwgQ29pbnMmIEMsIERUeXBlJiBEKXsKCglkb3VibGUgVG90YWwgPSAwOwoKCWZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBDLnNpemUoKTsgaSsrKXsKCQlUb3RhbCArPSBzdGQ6OmdldDwxPihDW2ldKSAqIERbaV07Cgl9CgoJcmV0dXJuIERvdWJsZUVxdWFsKFdlaWdodCwgVG90YWwsMC4wMDAwMDAwMDEpOwp9CgoKUlR5cGUgTWFrZUhvZ2UoZG91YmxlIFdlaWdodCwgQ29pbnMgQyl7CglEVHlwZSBMOwoJRFR5cGUgRChDLnNpemUoKSk7Cglib29sIEYgPSBmYWxzZTsKCVJUeXBlIFI7Cglmb3IgKGF1dG8mIG8gOiBDKXsKCQlMLnB1c2hfYmFjayhzdGF0aWNfY2FzdDxzdGQ6OnVpbnQ2NF90PihzdGQ6OmNlaWwoV2VpZ2h0IC8gc3RkOjpnZXQ8MT4obykpKSk7Cgl9CgoJd2hpbGUgKEYgPT0gZmFsc2UpewoJCWlmIChDaGVja1dlaWdodChXZWlnaHQsIEMsIEQpID09IHRydWUpewoJCQlSLnB1c2hfYmFjayhEKTsKCQl9CgoJCUFkZFZlY3RvcihELCBMKTsKCgkJRiA9IHRydWU7CgkJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IEQuc2l6ZSgpOyBpKyspCgkJewoJCQlpZiAoRFtpXSAhPSBMW2ldKXsKCQkJCUYgPSBmYWxzZTsKCQkJCWJyZWFrOwoJCQl9CgoJCX0KCX0KCglyZXR1cm4gUjsKfQoKYm9vbCBTaG93KGNvbnN0IGRvdWJsZSYgV2VpZ2h0LCBSVHlwZSBSLCBDb2lucyBDKXsKCWRvdWJsZSBUb3RhbCA9IDA7CgoJc3RkOjpjb3V0IDw8ICJpbnB1dCBXZWlnaHQ6IiA8PCBXZWlnaHQgPDwiZyI8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgImhhdmUgdGhlICIgPDwgUi5zaXplKCk8PCIgTGlzdHMiPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IHN0ZDo6c2V0dygxMCk8PCJhbW91bnR8IjsKCWZvciAoYXV0byYgbyA6IEMpewoJCXN0ZDo6Y291dCA8PCBzdGQ6OnNldHcoNSk8PHN0ZDo6Z2V0PDA+KG8pOwoJfQoKCXN0ZDo6Y291dDw8c3RkOjplbmRsOwoKCXN0ZDo6c29ydChSLmJlZ2luKCksIFIuZW5kKCksIFsmXShEVHlwZSYgQSwgRFR5cGUmIEIpewoJCWRvdWJsZSBUb3RhbEEgPSAwOwoJCWRvdWJsZSBUb3RhbEIgPSAwOwoJCWZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBBLnNpemUoKTsgaSsrKQoJCXsKCQkJVG90YWxBICs9IEFbaV0gKiBzdGQ6OmdldDwwPihDW2ldKTsKCQl9CgkJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IEIuc2l6ZSgpOyBpKyspCgkJewoJCQlUb3RhbEIgKz0gQltpXSAqIHN0ZDo6Z2V0PDA+KENbaV0pOwoJCX0KCQlyZXR1cm4gVG90YWxBIDwgVG90YWxCOwoJfSk7CgoJZm9yIChhdXRvJiBvbyA6IFIpewoJCWZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBvby5zaXplKCk7IGkrKykKCQl7CgkJCVRvdGFsICs9IG9vW2ldICogc3RkOjpnZXQ8MD4oQ1tpXSk7CgkJfQoJCXN0ZDo6Y291dCA8PCBzdGQ6OnNldHcoOSkgPDwgVG90YWw8PCJ8IjsKCQlmb3IgKGF1dG8mIG8gOiBvbyl7CgkJCXN0ZDo6Y291dCA8PCBzdGQ6OnNldHcoNSkgPDwgbzsKCQl9CgkJc3RkOjpjb3V0PDxzdGQ6OmVuZGw7CgkJVG90YWwgPSAwOwoJfQoKCglyZXR1cm4gdHJ1ZTsKfQoKCmludCBtYWluKCl7CglDb2lucyBDeyBzdGQ6Om1ha2VfdHVwbGUoMSwgMS4wKSwgc3RkOjptYWtlX3R1cGxlKDUsIDMuNyksIHN0ZDo6bWFrZV90dXBsZSgxMCwgNC41KSwgc3RkOjptYWtlX3R1cGxlKDUwLCA0LjApLCBzdGQ6Om1ha2VfdHVwbGUoMTAwLCA0LjgpLCBzdGQ6Om1ha2VfdHVwbGUoNTAwLCA3LjApLCB9OwoJZG91YmxlIFcgPSAwOwoJUlR5cGUgUjsKCglXID0gMjMuNzsKCVIgPSBNYWtlSG9nZShXLCBDKTsKCVNob3coVywgUiwgQyk7CgoJcmV0dXJuIDA7Cgp9