/**
* Created by lxw, liwei4939@126.com on 2017/11/4.
* 正整数数组的最小不可组成和
* 动态规划
*/
import java.util.Arrays;
public class unformedSum {
public int unformedSum1(int[] arr){
if(arr == null || arr.length == 0){
return 1;
}
int sum =0;
int min = Integer.MAX_VALUE;
for (int i=0; i< arr.length; i++){
sum += arr[i];
min = Math.min(min, arr[i]);
}
boolean[] dp = new boolean[sum + 1];
dp[0] =true;
for(int i =0; i< arr.length; i++){
for (int j= sum; j>= arr[i]; j--){
dp[j] = dp[j-arr[i]] ? true : dp[j];
}
}
for (int i=min; i <= sum; i++){
if(!dp[i]){
return i;
}
}
return sum + 1;
}
//若整数数组arr中一定有1,能够更快地得到最小不可组成和
public int unformedSum2(int[] arr){
if(arr == null || arr.length == 0){
return 1;
}
Arrays.sort(arr);
int range =0;
for (int i=0; i < arr.length; i++){
if(arr[i] > range + 1){
return range + 1;
} else {
range += arr[i];
}
}
return range + 1;
}
public static void main(String[] args){
unformedSum tmp =new unformedSum();
int[] arr1 = {3, 2, 5};
System.out.println(tmp.unformedSum1(arr1));
int[] arr2 = {3, 8, 1, 2};
System.out.println(tmp.unformedSum2(arr2));
}
}
正整数数组的最小不可组成和
最新推荐文章于 2021-07-17 20:55:46 发布