Se è abbastanza piccolo, puoi fare di meglio dell'algoritmo ingenuo, cioè meglio di 2 n volte. Qui "abbastanza piccolo" significa che m è più piccolo di qualcosa come n / lg n . Il tempo di esecuzione sarà comunque esponenziale, ad esempio potrebbe essere 2 n / 2 volte, ma sarà più veloce dell'algoritmo ingenuo.m2nmn/lgn2n/2
Per inciso, sembra che questo ci consenta di risolvere il problema in un tempo superiore a in alcuni casi in cui la matrice A ha un numero super-lineare di voci. Non so come quadrarlo con l'altra risposta fornita qui. Di conseguenza, dovresti controllare attentamente la mia risposta: potrebbe indicare che da qualche parte ho commesso un grave errore.2nA
L'approccio di base: scrittura , dove x 0 detiene i primi n / 2 componenti di x ed x 1 tiene l'ultimo n / 2 componenti; e similmente A = ( A 0 , A 1 ) , dove A 0 ha la sinistra n / 2 colonne di A e A 1 la destra nx=(x0,x1)x0n/2xx1n/2A=(A0,A1)A0n/2AA1 colonne. Ora A x ≤ b può essere riscritto nel modulon/2Ax≤b
A0x0+A1x1≤b,
o equivalentemente,
A0x0≤b−A1x1.
Enumera tutte le possibilità per A 0 x 0 e lascia che S indichi l'insieme dei valori possibili, ovvero2n/2A0x0S
S={A0x0:x0∈{0,1}n/2}.
T2n/2b−A1x1
T={b−A1x1:x1∈{0,1}n/2}.
Ora il problema diventa
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