1、牛客網原題:
題目描述 小易邀請你玩一個數字遊戲,小易給你一系列的整數。你們倆使用這些整數玩遊戲。每次小易會任意說一個數字出來,然後你需要從這一系列數字中選取一部分出來讓它們的和等於小易所說的數字。 例如: 如果{2,1,2,7}是你有的一系列數,小易說的數字是11.你可以得到方案2+2+7 = 11.如果頑皮的小易想坑你,他說的數字是6,那麼你沒有辦法拼湊出和為6 現在小易給你n個數,讓你找出無法從n個數中選取部分求和的數字中的最小數。 輸入描述:
輸入第一行為數字個數n (n ≤ 20)第二行為n個數xi (1 ≤ xi ≤ 100000)
輸出描述:
輸出最小不能由n個數選取求和組成的數
樣本1
輸入
35 1 2
輸出
4
2、題目分析:
2.1、自己一直有個誤解,就是手續找出給出的數字序列中,能表示的最小值min,然後在找出:在這個數字後面的不能被數字序列通過組合的第一個最小的數字。但是題目的意思是:最小值min應該從1開始,然後依次遞增,也就是尋找正數範圍內,最小的不能被表達的整數。
2.2、看了大家的評論,原來這個題目來源於code jam,這個google競賽的一個網站,
給出原題網址:http://code.google.com/codejam/contest/4244486/dashboard#s=p2
原題解法:http://code.google.com/codejam/contest/4244486/dashboard#s=a&a=2
3、code實現:已a
package schooloffer17;import java.util.ArrayList;import java.util.Collections;import java.util.Scanner;/** * Created by caoxiaohong on 17/11/6 11:33. * <數字遊戲></數字遊戲> * 小易邀請你玩一個數字遊戲... */public class NumberGame { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int n;//輸入數字個數 while (scanner.hasNext()){ n=scanner.nextInt(); scanner.nextLine();//換行 ArrayList<Integer> numbers=new ArrayList<Integer>(); for(int i=0;i<n;i++) numbers.add(scanner.nextInt()); // 1 ≤ xi ≤ 100000 Collections.sort(numbers); //如果最小的數字都比1大,那麼就不用進行下面的計算了,直接返回1即可.因為1就是最小的不能被表達的數字. if(numbers.get(0)>1) { System.out.println(1); continue; } /** * 迭代過程: * 1.min表示:numbers下標從0到i的數字進行組合,能表示的數字範圍:[1,min]; * 2.新增加了數字numbers.get(i)後,要想 * [1,min]U[tmp]U[1+tmp,min+tmp]=[1,min+tmp],則要求:tmp<=min+1即可 * 3.例子: * */ int min=1; //min初始化為第一個元素的值 int tmp; for(int i=1;i<n;i++){ tmp=numbers.get(i); if(tmp>min+1) break; else{ min += tmp; } } System.out.println(min+1); } }}