Как мне перечислить все m наборов неотрицательных целых чисел (a [1], ..., a [m]) с учетом следующих ограничений?
Для каждого i в {1, ..., m} существует число n [i]> = 0, такое что a [i] <= n [i]. </p>
Для каждой упорядоченной пары (i, j) с i, j в {1, ..., m} существуют числа c [i] [j], d [i] [j]> = 0 такое, что:
если a [i]> c [i] [j], то a [j] <= d [i] [j]. </p>
c [i] [j] = c [j] [i].
Пока что я нашел следующее решение. Есть ли более эффективный способ сделать это? Я программирую на C или C ++.
for a[1]=0,...,n[1] do
{
for j=2,...,m do
{
if a[1] > c[1][j] then n[j]:=min{n[j],d[1][j]}
else n[j]:=n[j]
}
for a[2]=0,...,n[2] do
{
for j=3,...,m do
{
if a[2] > c[2][j] then n[j]:=min{n[j],d[2][j]}
else n[j]:=n[j]
}
for a[3]=0,...,n[3] do
{
.
.
.
for a[m]=0,...,n[m] do
{
print (a[1],...,a[m])
}
}...}}
Я вижу одну большую неэффективность в этом алгоритме. Чтобы увидеть это, возьмем m = 2 для простоты. Скажите n [1] = n [2] = 2 и c [i] [j] = d [i] [j] = 0 для всех i, j. Теперь давайте рассмотрим алгоритм.
Начните с a [1] = 0: n [2] не изменяется, потому что a [1] <= 0. Мы печатаем (0,0), (0,1), (0,2). </p>
Далее следует [1] = 1: поскольку a [1]> c [1] [2], n [2] изменяется в цикле на min {n [2], d [1] [j] } = 0. Мы печатаем (1,0).
Наконец, a [1] = 2: поскольку a [1]> c [1] [2], n [2] изменяется в цикле на min {n [2], d [1] [j]} = 0. (Мы просто сделали то же самое, что и раньше. Это неэффективность.) Мы печатаем (2,0).
Примечание: для моего приложения можно предположить, что c [i] [j] = d [i] [j].