给定非负整数数组。我们的任务是找到最小数量的元素,以使它们的总和应大于数组其余元素的总和。
例子 :
Input : arr[] = {3, 1, 7, 1}
Output : 1
Smallest subset is {7}. Sum of
this subset is greater than all
other elements {3, 1, 1}
Input : arr[] = {2, 1, 2}
Output : 2
In this example one element is not
enough. We can pick elements with
values 1, 2 or 2, 2. In any case,
the minimum count is 2.
蛮力方法是找到所有可能子集的总和,然后将总和与其余元素的总和进行比较。
高效方法是采取最大的要素。我们按降序对值进行排序,然后从最大的元素中选取元素,直到严格得到给定数组总和的一半以上。
C++
// CPP program to find minimum number of
// elements such that their sum is greater
// than sum of remaining elements of the array.
#include
#include
using namespace std;
// function to find minimum elements needed.
int minElements(int arr[], int n)
{
// calculating HALF of array sum
int halfSum = 0;
for (int i = 0; i < n; i++)
halfSum = halfSum + arr[i];
halfSum = halfSum / 2;
// sort the array in descending order.
sort(arr, arr + n, greater());
int res = 0, curr_sum = 0;
for (int i = 0; i < n; i++) {
curr_sum += arr[i];
res++;
// current sum greater than sum
if (curr_sum > halfSum)
return res;
}
return res;
}
// Driver function
int main()
{
int arr[] = {3, 1, 7, 1};
int n = sizeof(arr) / sizeof(arr[0]);
cout << minElements(arr, n) << endl;
return 0;
}
Java
// Java code to find minimum number of elements
// such that their sum is greater than sum of
// remaining elements of the array.
import java.io.*;
import java.util.*;
class GFG {
// Function to find minimum elements needed
static int minElements(int arr[], int n)
{
// Calculating HALF of array sum
int halfSum = 0;
for (int i = 0; i < n; i++)
halfSum = halfSum + arr[i];
halfSum = halfSum / 2;
// Sort the array in ascending order and
// start traversing array from the ascending
// sort in descending order.
Arrays.sort(arr);
int res = 0, curr_sum = 0;
for (int i = n-1; i >= 0; i--) {
curr_sum += arr[i];
res++;
// Current sum greater than sum
if (curr_sum > halfSum)
return res;
}
return res;
}
// Driver Code
public static void main (String[] args) {
int arr[] = {3, 1, 7, 1};
int n = arr.length;
System.out.println(minElements(arr, n));
}
}
// This code is contributed by Gitanjali
Python3
# Python3 code to find minimum number of
# elements such that their sum is greater
# than sum of remaining elements of the array.
# function to find minimum elements needed.
def minElements(arr , n):
# calculating HALF of array sum
halfSum = 0
for i in range(n):
halfSum = halfSum + arr[i]
halfSum = int(halfSum / 2)
# sort the array in descending order.
arr.sort(reverse = True)
res = 0
curr_sum = 0
for i in range(n):
curr_sum += arr[i]
res += 1
# current sum greater than sum
if curr_sum > halfSum:
return res
return res
# driver code
arr = [3, 1, 7, 1]
n = len(arr)
print(minElements(arr, n) )
# This code is contributed by "Sharad_Bhardwaj".
C#
// C# code to find minimum number of elements
// such that their sum is greater than sum of
// remaining elements of the array.
using System;
class GFG {
// Function to find minimum elements needed
static int minElements(int []arr, int n)
{
// Calculating HALF of array sum
int halfSum = 0;
for (int i = 0; i < n; i++)
halfSum = halfSum + arr[i];
halfSum = halfSum / 2;
// Sort the array in ascending order and
// start traversing array from the ascending
// sort in descending order.
Array.Sort(arr);
int res = 0, curr_sum = 0;
for (int i = n-1; i >= 0; i--) {
curr_sum += arr[i];
res++;
// Current sum greater than sum
if (curr_sum > halfSum)
return res;
}
return res;
}
// Driver Code
public static void Main ()
{
int []arr = {3, 1, 7, 1};
int n = arr.Length;
Console.WriteLine(minElements(arr, n));
}
}
// This code is contributed by vt_m.
PHP
$halfSum)
return $res;
}
return $res;
}
// Driver Code
$arr = array(3, 1, 7, 1);
$n = sizeof($arr);
echo minElements($arr, $n);
// This code is contributed by ihritik
?>
Javascript
输出:
1
时间复杂度: O(n Log n)