#include <stddef.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
typedef unsigned char uchar;
typedef unsigned int uint;
typedef struct tAddend
{
struct tAddend* pPrev;
uint Value;
} tAddend;
void findRecursiveSolution(uint n, uint maxAddend, tAddend* pPrevAddend)
{
uint i;
for (i = maxAddend; ; i--)
{
if (n == 0)
{
while (pPrevAddend != NULL)
{
printf("+%u", pPrevAddend
->Value
); pPrevAddend = pPrevAddend->pPrev;
}
return;
}
if (n >= i && i > 0)
{
tAddend a;
a.pPrev = pPrevAddend;
a.Value = i;
findRecursiveSolution(n - i, i - 1, &a);
}
if (i <= 1)
{
break;
}
}
}
void printDynamicSolution(uchar** pTable, uint n, uint idx, uint sum, tAddend* pPrevAddend)
{
uchar el = pTable[idx][sum];
assert((el
!= 0) && (el
!= 5) && (el
!= 7));
if (el & 2) // 2,3,6 - other(s)
{
printDynamicSolution(pTable,
n,
idx - 1,
sum,
pPrevAddend);
}
if (el & 4) // self + other(s)
{
tAddend a;
a.pPrev = pPrevAddend;
a.Value = idx + 1;
printDynamicSolution(pTable,
n,
idx - 1,
sum - (idx + 1),
&a);
}
if (el & 1) // self, found a solution
{
tAddend a;
a.pPrev = pPrevAddend;
a.Value = idx + 1;
pPrevAddend = &a;
while (pPrevAddend != NULL)
{
printf("+%u", pPrevAddend
->Value
); pPrevAddend = pPrevAddend->pPrev;
}
}
}
void findDynamicSolution(uint n)
{
uchar** table;
uint i, j;
if (n == 0)
{
return;
}
// Allocate the DP table
table
= malloc(sizeof(uchar
*) * n
);
if (table == NULL)
{
printf("not enough memory\n"); return;
}
for (i = 0; i < n; i++)
{
if (table[i] == NULL)
{
while (i > 0)
{
}
printf("not enough memory\n"); return;
}
}
// Fill in the DP table
for (i = 0; i < n; i++)
{
for (j = 0; j <= n; j++)
{
if (i == 0)
{
table[i][j] = (i + 1 == j); // self
}
else
{
table[i][j] = (i + 1 == j) + // self
2 * (table[i - 1][j] != 0) + // other(s)
4 * ((j >= i + 1) && (table[i - 1][j - (i + 1)] != 0)); // self + other(s)
}
}
}
printDynamicSolution(table, n, n - 1, n, NULL);
for (i = 0; i < n; i++)
{
}
}
int main(int argc, char** argv)
{
uint n;
if (argc
!= 2 || sscanf(argv
[1], "%u", &n
) != 1) {
n = 10;
}
printf("Recursive Solution:\n"); findRecursiveSolution(n, n, NULL);
printf("\nDynamic Solution:\n"); findDynamicSolution(n);
return 0;
}
I2luY2x1ZGUgPHN0ZGRlZi5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+Cgp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWNoYXI7CnR5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQ7Cgp0eXBlZGVmIHN0cnVjdCB0QWRkZW5kCnsKICBzdHJ1Y3QgdEFkZGVuZCogcFByZXY7CiAgdWludCBWYWx1ZTsKfSB0QWRkZW5kOwoKdm9pZCBmaW5kUmVjdXJzaXZlU29sdXRpb24odWludCBuLCB1aW50IG1heEFkZGVuZCwgdEFkZGVuZCogcFByZXZBZGRlbmQpCnsKICB1aW50IGk7CgogIGZvciAoaSA9IG1heEFkZGVuZDsgOyBpLS0pCiAgewogICAgaWYgKG4gPT0gMCkKICAgIHsKICAgICAgd2hpbGUgKHBQcmV2QWRkZW5kICE9IE5VTEwpCiAgICAgIHsKICAgICAgICBwcmludGYoIisldSIsIHBQcmV2QWRkZW5kLT5WYWx1ZSk7CiAgICAgICAgcFByZXZBZGRlbmQgPSBwUHJldkFkZGVuZC0+cFByZXY7CiAgICAgIH0KICAgICAgcHJpbnRmKCJcbiIpOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKG4gPj0gaSAmJiBpID4gMCkKICAgIHsKICAgICAgdEFkZGVuZCBhOwogICAgICBhLnBQcmV2ID0gcFByZXZBZGRlbmQ7CiAgICAgIGEuVmFsdWUgPSBpOwogICAgICBmaW5kUmVjdXJzaXZlU29sdXRpb24obiAtIGksIGkgLSAxLCAmYSk7CiAgICB9CgogICAgaWYgKGkgPD0gMSkKICAgIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQp9Cgp2b2lkIHByaW50RHluYW1pY1NvbHV0aW9uKHVjaGFyKiogcFRhYmxlLCB1aW50IG4sIHVpbnQgaWR4LCB1aW50IHN1bSwgdEFkZGVuZCogcFByZXZBZGRlbmQpCnsKICB1Y2hhciBlbCA9IHBUYWJsZVtpZHhdW3N1bV07CgogIGFzc2VydCgoZWwgIT0gMCkgJiYgKGVsICE9IDUpICYmIChlbCAhPSA3KSk7CgogIGlmIChlbCAmIDIpIC8vIDIsMyw2IC0gb3RoZXIocykKICB7CiAgICBwcmludER5bmFtaWNTb2x1dGlvbihwVGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBuLAogICAgICAgICAgICAgICAgICAgICAgICAgaWR4IC0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmV2QWRkZW5kKTsKICB9CgogIGlmIChlbCAmIDQpIC8vIHNlbGYgKyBvdGhlcihzKQogIHsKICAgIHRBZGRlbmQgYTsKICAgIGEucFByZXYgPSBwUHJldkFkZGVuZDsKICAgIGEuVmFsdWUgPSBpZHggKyAxOwoKICAgIHByaW50RHluYW1pY1NvbHV0aW9uKHBUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgIG4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpZHggLSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgc3VtIC0gKGlkeCArIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgJmEpOwogIH0KCiAgaWYgKGVsICYgMSkgLy8gc2VsZiwgZm91bmQgYSBzb2x1dGlvbgogIHsKICAgIHRBZGRlbmQgYTsKICAgIGEucFByZXYgPSBwUHJldkFkZGVuZDsKICAgIGEuVmFsdWUgPSBpZHggKyAxOwoKICAgIHBQcmV2QWRkZW5kID0gJmE7CiAgICB3aGlsZSAocFByZXZBZGRlbmQgIT0gTlVMTCkKICAgIHsKICAgICAgcHJpbnRmKCIrJXUiLCBwUHJldkFkZGVuZC0+VmFsdWUpOwogICAgICBwUHJldkFkZGVuZCA9IHBQcmV2QWRkZW5kLT5wUHJldjsKICAgIH0KICAgIHByaW50ZigiXG4iKTsKICB9Cn0KCnZvaWQgZmluZER5bmFtaWNTb2x1dGlvbih1aW50IG4pCnsKICB1Y2hhcioqIHRhYmxlOwogIHVpbnQgaSwgajsKCiAgaWYgKG4gPT0gMCkKICB7CiAgICByZXR1cm47CiAgfQoKICAvLyBBbGxvY2F0ZSB0aGUgRFAgdGFibGUKCiAgdGFibGUgPSBtYWxsb2Moc2l6ZW9mKHVjaGFyKikgKiBuKTsKCiAgaWYgKHRhYmxlID09IE5VTEwpCiAgewogICAgcHJpbnRmKCJub3QgZW5vdWdoIG1lbW9yeVxuIik7CiAgICByZXR1cm47CiAgfQoKICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQogIHsKICAgIHRhYmxlW2ldID0gbWFsbG9jKG4gKyAxKTsKCiAgICBpZiAodGFibGVbaV0gPT0gTlVMTCkKICAgIHsKICAgICAgd2hpbGUgKGkgPiAwKQogICAgICB7CiAgICAgICAgZnJlZSh0YWJsZVstLWldKTsKICAgICAgfQoKICAgICAgZnJlZSh0YWJsZSk7CiAgICAgIHByaW50Zigibm90IGVub3VnaCBtZW1vcnlcbiIpOwogICAgICByZXR1cm47CiAgICB9CiAgfQoKICAvLyBGaWxsIGluIHRoZSBEUCB0YWJsZQoKICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQogIHsKICAgIGZvciAoaiA9IDA7IGogPD0gbjsgaisrKQogICAgewogICAgICBpZiAoaSA9PSAwKQogICAgICB7CiAgICAgICAgdGFibGVbaV1bal0gPSAoaSArIDEgPT0gaik7IC8vIHNlbGYKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICB0YWJsZVtpXVtqXSA9IChpICsgMSA9PSBqKSArIC8vIHNlbGYKICAgICAgICAgIDIgKiAodGFibGVbaSAtIDFdW2pdICE9IDApICsgLy8gb3RoZXIocykKICAgICAgICAgIDQgKiAoKGogPj0gaSArIDEpICYmICh0YWJsZVtpIC0gMV1baiAtIChpICsgMSldICE9IDApKTsgLy8gc2VsZiArIG90aGVyKHMpCiAgICAgIH0KICAgIH0KICB9CgogIHByaW50RHluYW1pY1NvbHV0aW9uKHRhYmxlLCBuLCBuIC0gMSwgbiwgTlVMTCk7CgogIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCiAgewogICAgZnJlZSh0YWJsZVtpXSk7CiAgfQoKICBmcmVlKHRhYmxlKTsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQp7CiAgdWludCBuOwoKICBpZiAoYXJnYyAhPSAyIHx8IHNzY2FuZihhcmd2WzFdLCAiJXUiLCAmbikgIT0gMSkKICB7CiAgICBuID0gMTA7CiAgfQoKICBwcmludGYoIlJlY3Vyc2l2ZSBTb2x1dGlvbjpcbiIpOwogIGZpbmRSZWN1cnNpdmVTb2x1dGlvbihuLCBuLCBOVUxMKTsKCiAgcHJpbnRmKCJcbkR5bmFtaWMgU29sdXRpb246XG4iKTsKICBmaW5kRHluYW1pY1NvbHV0aW9uKG4pOwoKICByZXR1cm4gMDsKfQo=