У меня может возникнуть соблазн сделать это в рекурсивной функции. Это кажется простым. Это может быть не самым лучшим, но это будет хорошо работать.
Это очень много в псевдокоде и предполагает, что числа равны 1..END. Если вы получили список, то вам следует отсортировать, а затем использовать список [i].
find(int curpos,int cursum,int sumleft,char output[])
{
if (sumleft == 0)
print(output);
if (curpos > sumleft)
return;
for(i=curpos;i<=TARGET && i<=sumleft)
find(i+1,cursum+i,sumleft-i,output+i."+%d")
}
main()
{
char output[100];
find(1,0,TARGET,"");
}