1) Вариантов бесконечно много.
2)
пример
#include<iostream>
#include<conio.h>
using namespace std;
void main()
{
int N, i = 0;
static int moneti[4] = {20,10,5,1};
cout << "vvedite 4islo \n";
cin >> N;
/* Пока не разложили на все слогаемые */
while (N > 0)
{
/* Если нашли очередной слогаемое - выводим его,
если он последний - после него перевод строки, иначе ' ',
вычитаем из N слогаемое и не увеличиваем i (может быть
несколько равных слогаемых) */
if ((N - moneti[i] >= 0))
{
printf("%d%c", moneti[i], N > moneti[i] ? ' ' : '\n');
N -= moneti[i];
continue;
}
/* i - не слогаемое - проверяем следующий */
i++;
}
getch();
}