the least adding numbers--algorithm -
i came across problem online.
given integer:n , array int arr[], have add elements array can generate 1 n using (add) element in array.
please keep in mind can use each element in array once when generating x (1<=x<=n). return number of least adding numbers.
for example: n=6, arr = [1, 3] 1 in arr. add 2 arr. 3 in arr 4 = 1 + 3 5 = 2 + 3 6 = 1 + 2 + 3 return 1 since need add 1 element 2. can give hints?
n can made adding subset of 1 n - 1 numbers except n = 2 , n = 1. so, number x can must made when previous 1 x - 1 consecutive elements in array. example -
arr[] = {1, 2, 5}, n = 9 ans := 0 1 present. 2 present. 3 absent. prior 1 (3 - 1) elements present. 3 added in array. 3 built using existed elements, answer won't increase. same rule 4 , 5 so, ans 0 arr[] = {3, 4}, n >= 2 ans = 2 arr[] = {1, 3}, n >= 2 ans = 1 so, seems that, if 1 , 2 not present in array, have add element regardless of previous elements in array or not. later numbers can made using previous elements. , when trying making number x (> 2), found previous 1 x - 1 elements in array. x can made.
so, need check if 1 , 2 present or not. answer of problem won't bigger 2
constraint 2
in above algorithm, assume, when new element x not present in array can made using existed elements of array, answer won't increase x added in array used next numbers building. if x can't added in array?
then, turn subset sum problem. every missing number have check if number can made using subset of elements in array. typical o(n^2) dynamic programming algorithm.
int subsetsum(vector<int>& arr, int n) { // value of subset[i][j] true if there subset of set[0..j-1] // sum equal bool subset[n + 1][arr.size() + 1]; // if sum 0, answer true (int = 0; <= arr.size(); i++) subset[0][i] = true; // if sum not 0 , set empty, answer false (int = 1; <= n; i++) subset[i][0] = false; // fill subset table in botton manner (int = 1; <= n; i++) { (int j = 1; j <= arr.size(); j++) { subset[i][j] = subset[i][j - 1]; if (i >= set[j - 1]) subset[i][j] = subset[i][j] || subset[i - set[j - 1]][j - 1]; } } unordered_map<int, bool> exist; for(int = 0; < arr.size(); ++i) { exist[arr[i]] = true; } int ans = 0; for(int = 1; <= n; ++i) { if(!exist[i] or !subset[i][arr.size()]) { ans++; } } return ans; }
Comments
Post a Comment