求不定方程x1+—xk=J的非负整数解
#include <stdio.h>
#define K 3
#define J 5
void main()
{
int a[K] = { 0 };
bool TF;
int i, j, t;
TF = false;
t = 0;
i = 0;
while (1)
{
if (i == 0)
{
if (TF)
{
a[i]++;
if (a[i] > J)
break;
}
}
else
{
if (TF)
{
a[i]++;
if (a[i] > J - t)
{
a[i] = 0;
t -= a[i - 1];
i--;
TF = true;
continue;
}
}
if (i == K - 1)
{
if (t + a[i] == J)
{
for (j = 0; j < K; j++)
{
printf("%d ", a[j]);
}
printf("\n");
}
TF = true;
continue;
}
}
t += a[i];
i++;
TF = false;
}
}
变体一:
求不定方程x1+—xk=J的正整数解
#include <stdio.h>
#define K 2
#define J 4
void main()
{
int a[K] = { 0 };
int i, j, t;
t = 0;
i = 0;
while (1)
{
if (i == 0)
{
a[i]++;
if (a[i] >= J)
break;
}
else
{
a[i]++;
if (a[i] > J - t)
{
a[i] = 0;
t -= a[i - 1];
i--;
continue;
}
if (i == K - 1)
{
if (t + a[i] == J)
{
for (j = 0; j < K; j++)
{
printf("%d ", a[j]);
}
printf("\n");
}
continue;
}
}
t += a[i];
i++;
}
}
变体二:求不定方程x1+—xk=J在约束条件0<=x1<=m1—-0<=xk<=mk下的非负整数解
#include <stdio.h>
#define K 2
#define J 5
void main()
{
int a[K] = { 0 };
int m[K] = { 2, 3 };
bool TF;
int i, j, t;
TF = false;
t = 0;
i = 0;
while (1)
{
if (i == 0)
{
if (TF)
{
a[i]++;
if (a[i] > m[i] || a[i] > J)
break;
}
}
else
{
if (TF)
{
a[i]++;
if (a[i] > J - t || a[i] > m[i])
{
a[i] = 0;
t -= a[i - 1];
i--;
TF = true;
continue;
}
}
if (i == K - 1)
{
if (t + a[i] == J)
{
for (j = 0; j < K; j++)
{
printf("%d ", a[j]);
}
printf("\n");
}
TF = true;
continue;
}
}
t += a[i];
i++;
TF = false;
}
}
变体三:求不定方程x1+—xk=J在约束条件1<=x1<=m1—-1<=xk<=mk下的正整数解
#include <stdio.h>
#define K 2
#define J 4
void main()
{
int a[K] = { 0 };
int m[K] = { 2, 3 };
int i, j, t;
t = 0;
i = 0;
while (1)
{
if (i == 0)
{
a[i]++;
if (a[i] > m[i] || a[i] >= J)
break;
}
else
{
a[i]++;
if (a[i] > J - t || a[i] > m[i])
{
a[i] = 0;
t -= a[i - 1];
i--;
continue;
}
if (i == K - 1)
{
if (t + a[i] == J)
{
for (j = 0; j < K; j++)
{
printf("%d ", a[j]);
}
printf("\n");
}
continue;
}
}
t += a[i];
i++;
}
}