树根_有假币_求正数数组的最小不可组成和
数根
// write your code here
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//注意题目给的输入范围!!!
while(sc.hasNext()){//只能用str保存或者大数!
String str = sc.nextLine();
//我们需要将每一位相加即可!
int result = 0;
do{
result = 0;//将和重置为0!!!
for(int i = 0;i< str.length();i++){
//将各位相加!
result = result + (str.charAt(i) - '0');
}
//将 result 转成字符串继续相加!
str = result + "";
}while(result>9);
System.out.println(result);
}
}
} 有假币
求正数数组的最小不可组成和
import java.util.*;
public class Solution {
/**
* 正数数组中的最小不可组成和
* 输入:正数数组arr
* 返回:正数数组中的最小不可组成和
*/
public void getNumber(int[] arr,ArrayList<Integer> result,int pos,int sum){
if(pos==arr.length){
return;
}
for(int i = pos;i<arr.length;i++){
sum += arr[i];
result.add(sum);
getNumber(arr,result,i+1,sum);
sum -= arr[i];
}
}
public int getFirstUnFormedNum(int[] arr) {
//2种情况: 1.[min,max] 有正数不能被子集相加得到! 返回该 数
// 2.[min,max] 所以正数都能被子集相加得到 返回 max+1
Arrays.sort(arr);
int min = arr[0];
int max = arr[0];
ArrayList<Integer> result = new ArrayList<>();
getNumber(arr,result,0,0);
for(int i = 1;i<arr.length;i++){
max += arr[i];
}
for(int i = min+1;i<max;i++){
if(!result.contains(i)){
return i;
}
}
return max+1;
}
}