这是一个面试问题: 输入: 整数N;不同的正整数a1,a2 ... aN;
输出: 最小正整数m,不能以m = x1 * a1 + x2 * a2 + ... xN * aN的形式表示,其中xi = {0,1}。
答案 0 :(得分: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);
}
我计算了所有可能的总和,并迭代直到我找到一个不在列表中的整数
答案 1 :(得分:1)
对于速度极快的全数字3代码, 请参阅Aliaksei Safryhin的代码explanation at polygenelubricants.com。该系列 像
这样的陈述*pTo++ += short(*pFrom++) << 8; *pTo++ += short(*pFrom++) << 8;
可能看起来笨拙和缓慢,但在我的测试中运行的速度比移位位图方法快许多倍。另请参阅Al Zimmermann's Son of Darts和How can I improve this algorithm for solving a modified Postage Stamp puzzle?,如果您能找到2010年7月7日的John Morris的darts.pdf,它包含了一个相当快的枚举器代码,用于3到20个数字的首次丢失子集和
答案 2 :(得分:0)
由于两个连续数字之间的最小差异是a n 因子中的最小值,0表示,我会说
min n (a n ) - 1
当然,如果min n (a n )= 1,你可以对第二个到最小值进行类似的推理。