Troszkę się zastanawiałem jak można znaleźć Twoją wagę. Doszedłem do wniosku, że jest to jednoznacznie nie możliwe. Z samej matematyki. Analizując:
Mamy wartości monet:
w1 = 1gr
w2 = 2gr
w3 = 5gr
Mamy masy monet:
m1=1.64
m2=2.13
m3=2.59
Mamy ilości danych monet:(przykladowo)
n1 = 25
n2 = 7
n3 = 18
Zatem z nich wyliczyliśmy masę monet:
waga = n1*m1 + n2*m2 + n3*m3
I z tej masy chcemy przejść do całkowitej wartości monet:
kwota = n1*w1 + n2*w2 + n3*w3
Nie można tego jednoznacznie wyliczyć za pomocą dodawania/odejmowania/mnożenia/dzielenia ... Chociaż rozumiem ideę wzoru, który miałeś - tylko problem w tym, że jest on wynikiem błędu matematycznego. Zapisując szeregami:
waga = suma(n m) // nie ma na tym forum LaTeXu więc ciężko będzie :D
kwota = suma(n w)
Zasadniczy błąd polegał chyba na zamienieniu sumy iloczynów ilości i mas na dwie sumy osobno ilości i osobno mas.
waga = suma(n)*suma(m)
// co jest zdecydowanie błędne bo waga w tym momencie ma po wymnożeniu 9 elementów
kwota = suma(n)*suma(w)
więc suma(n) = waga/suma(m)
Wszystko doprowadziło do wzoru:
kwota = (waga*suma(w) ) / suma(m)
Czyli do:
kwota = waga wszystkich monet*(1+2+5)/1,64+2,13+2,59
Jednak możliwe jest znalezienie numerycznie wszystkich możliwych kombinacji liniowych! Wystarczy zrobić kilka pętli dobierających różne ilości monet. Jeżeli ich łączna masa będzie równa wadze monet to spełniają one nasze warunki. Przykładowy kod:
#include <iostream>
using namespace std;
int main()
{
double waga_wszystkich=0;
double wartosc_wszystkich=0;
double wartosc_wszystkich_z_wagi=0;
double grosze[] = {1, 2, 5};
double mas[] = {1.64, 2.13, 2.59};
double ilosc[] = {25, 7, 18};
/*
for(int i=0; i<3; i++) cin>>ilosc[i];
*/
for(int i=0; i<3; i++)
{
waga_wszystkich+=ilosc[i]*mas[i];
}
cout<<"Drobniaki waga: "<< waga_wszystkich <<endl;
for(int i=0; i<3; i++)
{
wartosc_wszystkich+= ilosc[i]*grosze[i];
}
cout<<"Wartosc wszystkich: "<<wartosc_wszystkich<<endl;
/* Stary wzor */
wartosc_wszystkich_z_wagi = waga_wszystkich*8/(1.64+ 2.13+ 2.59);
cout<<"Wartosc wszystkich z wagi (stary wzor): "<<wartosc_wszystkich_z_wagi<<endl;
/* Wszystkie możliwe wartosci */
cout<<"Wartosc z mozliwej wagi i ilosc danych monet:"<<endl;
for(double i=0; i<waga_wszystkich; i++)
for(double j=0; j<waga_wszystkich; j++)
for(double k=0; k<waga_wszystkich; k++)
{
double nibymasa = mas[0]*i+mas[1]*j+mas[2]*k;
if(nibymasa==waga_wszystkich)
{
cout<<"Waga: "<<nibymasa<<" - Kombinacja: \n";
cout<<grosze[0]*i+grosze[1]*j+grosze[2]*k<<"\t----->\t";
cout<<grosze[0]<<"gr - "<<i<<",\t"<<grosze[1]<<"gr - "<<j<<",\t"<<grosze[2]<<"gr - "<<k<<"\n\n";
}
}
return false;
}