【发布时间】:2010-08-10 23:32:52
【问题描述】:
如何枚举所有非负整数的 m 元组 (a[1],...,a[m]) 受以下约束?
-
对于 {1,...,m} 中的每个 i,有一个数 n[i] >= 0 使得 a[i]
李> -
对于 {1,...,m} 中具有 i,j 的每个有序对 (i,j),有数字 c[i][j], d[i][j] >= 0 使得:
如果 a[i] > c[i][j],则 a[j]
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。对所有 i,j 说 n[1] = n[2] = 2 和 c[i][j] = d[i][j] = 0。现在让我们来看看算法。
从 a[1] = 0 开始:n[2] 不变,因为 a[1]
接下来是a[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]。
【问题讨论】:
-
你想达到什么目的?作业?
-
a[i] 是未知理想的可能素因数的指数。为了确定理想,每个元组都被视为一个案例,并对每个案例进行进一步的计算。不是家庭作业。
-
我认为详细说明此任务的目的会有所帮助。在没有任何激励因素的情况下,很难提出有用的实施策略。
标签: algorithm integer constraints enumeration tuples