2011-10-18 2 views
3

ここにインタビューの質問があります: 入力: 整数N;異なる正の整数a1、a2 ... aN;入力シーケンスで表現できない最小数を見つける方法

出力: 最小正の整数mは、m = x1 * a1 + x2 * a2 + ... xN * aNの形式では表現できません。ここでxi = {0,1}です。

+0

すべての2^nの可能性を列挙するよりも優れたアプローチがあるのだろうかと思います。ナップザック問題に関連しているように見えますが、実際の削減は見られません。 – Nemo

+0

多項式のユニバーサルコードにも関係します。 – ruslik

答えて

1

ナイーブ溶液:

public static void calcAllSums(int[] arr, int sum, int curIndex, Hashtable<Integer,Boolean> sums){ 
    if (curIndex == arr.length) return; 
    int sum1 = sum+arr[curIndex]; 
    int sum2 = sum; 
    sums.put(sum1, true); 
    sums.put(sum2, true); 
    calcAllSums(arr, sum1, curIndex+1, sums); 
    calcAllSums(arr, sum2, curIndex+1, sums); 
} 
public static void main(String[] args){ 
    int[] arr = {1,3,5}; 
    Hashtable<Integer,Boolean> sums = new Hashtable<Integer,Boolean>(); 
    calcAllSums(arr, 0, 0, sums); 
    int i=0; 
    while (sums.containsKey(i)) i++; 
    System.out.println(i); 
} 

iが非常に高速全和-の-3-番号コードするリスト

+0

与えられた問題は、NP困難問題であり、最良解はO(2^n/2)であるサブセット和問題の変形である。 http://en.wikipedia.org/wiki/Subset_sum_problem、上記のalgoは、実際に最適化されたO(2^n)を要約します。 – vikas368

1

でない整数を見つけるまで私はすべての可能な和を計算し、反復、 Aliaksei Safryhinのコードを参照してください。

*pTo++ += short(*pFrom++) << 8; *pTo++ += short(*pFrom++) << 8; 

よう 一連のステートメントは、不器用なと遅いように見えますが、私のテストにシフトビットマップ方式よりも高速に何度も走ったことがあります。 Al Zimmermann's Son of DartsHow can I improve this algorithm for solving a modified Postage Stamp puzzle?も参照し、2010年7月7日のJohn Morrisのdarts.pdfが見つかる場合は、3〜20の数字の最初の不足サブセット合計のかなり高速な列挙子のコードが含まれています。

+0

優れたリソースは、再びアップアップします。 :) –

0
二つの連続番号の間の最小の差が N要素の少なくともあるので

、及び0私は言うだろう、表現可能である

N N) - 1

もちろん、min n(a n)= 1の場合は、2番目から最小の同様の推論を行うことができます。

関連する問題