Pomyśl jak bankier: masz jakąś kwotkę i chcesz ją podzielić na jak najmniej banknotów. Największy banknot jaki posiadasz to 1000.
Obliczasz ile banknotów 1000 zmieści się w w posiadanej sumie, czyli jest to pierwsa poszukiwana wartość. Odejmujesz sumę tysiączek od posiadanej wartości i zaczynasz od nowa dla kolejnego banknotu o niższej wartości, tutaj 500.
Wracając do zadania: posortuj malejąco zbiór liczb i zacznij od największej z nich, czyli pierwszej.
int main()
{
int x;
srand(GetTickCount);
int suma = abs(rand());
printf("suma: %d\n", suma);
int wartosc[] = {1000,500,200,100,50,20,10,5,2,1};
int ilosc[] = {0,0,0,0,0,0,0,0,0,0};
#define items (sizeof(wartosc)/sizeof(wartosc[0]))
for (x=0; x<items; x++)
{
ilosc[x] = suma/wartosc[x];
suma -= (wartosc[x] * ilosc[x]);
if (ilosc[x]) printf("%d * %d\n", ilosc[x], wartosc[x]);
}