Implementei o problema do troco em C++. Acho que ficou bom !
#include <iostream>
using namespace std;
int numeroMoedas(double troco,int n,double *moedas){
int solucao[n-1];
double soma = 0.0;
solucao[n-1] = 0;//caso base
for(int i = n - 2;i >= 0;i--){
if(soma + moedas >= troco)//se a soma total mais o valor da moeda for maior que o troco
solucao = solucao[i+1];//solução é a anterior do array
else {
bool repetiu = false;//vê se repetiu uma mesma moeda
while(soma + moedas < troco){ //enquanto a soma mais a moeda respectiva for menor que o troco
if(!repetiu)//se não repetiu
solucao = solucao[i+1] + 1;//soma a solução anterior + 1
else
solucao = solucao + 1; //soma a solucao atual + 1
soma = soma + moedas;//incrementa a soma
repetiu = true;//moeda repetiu
}
}
}
return solucao[0];//quantidade de moedas mínima
}
int main(){
int n = 12;
double troco = 3149.32;
double moedas[12] = {0.01,0.05,0.10,0.25,0.50,1.00,2.00,5.00,10.00,20.00,50.00,100.00};
int r = numeroMoedas(troco,n,moedas);
cout << r << endl;
system("pause");
return 0;
}