Si est suffisamment petit, vous pouvez faire mieux que l'algorithme naïf, c'est-à-dire mieux que 2 n fois. Ici, «assez petit» signifie que m est plus petit que quelque chose comme n / lg n . Le temps d'exécution sera toujours exponentiel - par exemple, il pourrait être 2 n / 2 fois - mais il sera plus rapide que l'algorithme naïf.m2nmn/lgn2n/2
Soit dit en passant, il semble que cela nous permette de résoudre le problème en un temps inférieur à dans certains cas où la matrice A a un nombre d'entrées super-linéaire. Je ne sais pas comment concilier cela avec l'autre réponse fournie ici. Par conséquent, vous devriez vérifier attentivement ma réponse: cela pourrait indiquer que j'ai commis une grave erreur quelque part.2nA
L'approche de base: écrire , où x 0 contient les n / 2 premiers composants de x et x 1 contient les n / 2 derniers composants; et de même A = ( A 0 , A 1 ) , où A 0 a les n / 2 colonnes gauche de A et A 1 le n droitx=(x0,x1)x0n/2xx1n/2A=(A0,A1)A0n/2AA1 colonnes. Maintenant, A x ≤ b peut être réécrit sous la formen/2Ax≤b
A0x0+A1x1≤b,
ou équivalent,
A0x0≤b−A1x1.
Énumérer toutes les possibilités pour A 0 x 0 et laisser S désigner l'ensemble des valeurs possibles, c'est-à-dire2n/2A0x0S
S={A0x0:x0∈{0,1}n/2}.
T2n/2b−A1x1
T={b−A1x1:x1∈{0,1}n/2}.
Maintenant, le problème devient
S,T⊆Zm2n/2s∈St∈Ts≤t
≤si≤tii
O(2n/2(n/2)m−1)mn/lgn2n
m=1m=1xi=1A1,i≤0xi=0x