检查每个元素乘以整数时是否存在总和为1的子集
给定一个正数数组arr[] 。任务是检查是否存在任何大小的子集,以便在将子集的每个元素与任何整数相乘后,将子集的总和设为 1。
例子:
Input: arr[] = {12, 5, 9, 21}
Output: True
Explanation: Pick numbers 5 and 9. 5*2 + 9*(-1) = 1
Input: arr[] = {9, 29, 6, 10}
Output: True
Explanation: Pick numbers 29 and 10. 29*(-1) + 10*(3) = 1
方法:如果数组中任何一对数字的HCF为1 ,则返回True否则返回False 。如果gcd(a, b) = 1 ,方程ax + by = 1对x 和 y有解。无需检查所有可能对的 HCF,因为 GCD 是一个关联函数。
gcd(a0, a1, …, an – 1) = gcd(a0, gcd(a1, …, an-1) = gcd(gcd(a0, a1), gcd(a2, …, an-1)) = …
以此类推,包括所有可能的组合。所以只需遍历数组,直到找到1的 gcd。在另一个世界中,如果gcd(a0, a1, ..., an – 1) = 1,则存在#{ai0, ..., aik} = k, 1 <= k <= N的子序列aij ,其 gcd 为1 .请按照以下步骤解决问题:
- 将变量res初始化为arr[0]。
- 使用变量i遍历范围[1, N)并执行以下任务:
- 将res的值设置为res和arr[i] 的 gcd。
- 如果res等于1,则返回true。
- 执行上述步骤后,打印false作为答案。
下面是上述方法的实现:
C++
// C++ Program for the above approach
#include
using namespace std;
// Function to find GCD
int gcd(int a, int b)
{
if (a < b)
gcd(b, a);
if (a % b == 0)
return b;
else
return gcd(b, a % b);
}
// Utility Function
bool IsArrayGood(int arr[], int N)
{
int i, res = arr[0];
for (i = 1; i < N; i++) {
res = gcd(res, arr[i]);
if (res == 1)
return true;
}
return false;
}
// Driver Code
int main()
{
int arr[] = { 12, 5, 9, 21 };
int N = sizeof(arr) / sizeof(arr[0]);
bool ver = IsArrayGood(arr, N);
if (ver == true)
cout << "True";
else
cout << "False";
return 0;
}
Java
/*package whatever //do not write package name here */
import java.io.*;
import java.lang.*;
import java.util.*;
public class GFG {
// Recursive function to return gcd of a and b
static int gcd(int a, int b)
{
if (a < b)
gcd(b, a);
if (a % b == 0)
return b;
else
return gcd(b, a % b);
}
// Utility Function
static boolean IsArrayGood(int arr[], int N)
{
int i, res = arr[0];
for (i = 1; i < N; i++) {
res = gcd(res, arr[i]);
if (res == 1)
return true;
}
return false;
}
// Driver Code
public static void main(String[] args)
{
int arr[] = { 12, 5, 9, 21 };
int N = arr.length;
boolean ver = IsArrayGood(arr, N);
if (ver == true){
System.out.println("True");
}
else{
System.out.println("False");
}
}
}
// This code is contributed by hrithikgarg03188
Python3
# Python code for the above approach
# Function to find GCD
def gcd(a, b):
if (a < b):
gcd(b, a);
if (a % b == 0):
return b;
else:
return gcd(b, a % b);
# Utility Function
def IsArrayGood(arr, N):
i = None
res = arr[0];
for i in range(1, N):
res = gcd(res, arr[i]);
if (res == 1):
return True;
return False;
# Driver Code
arr = [12, 5, 9, 21];
N = len(arr)
ver = IsArrayGood(arr, N);
if (ver == True):
print("True");
else:
print("False");
# This code is contributed by Saurabh Jaiswal
C#
/*package whatever //do not write package name here */
using System;
public class GFG {
// Recursive function to return gcd of a and b
static int gcd(int a, int b)
{
if (a < b)
gcd(b, a);
if (a % b == 0)
return b;
else
return gcd(b, a % b);
}
// Utility Function
static bool IsArrayGood(int[] arr, int N)
{
int i, res = arr[0];
for (i = 1; i < N; i++) {
res = gcd(res, arr[i]);
if (res == 1)
return true;
}
return false;
}
// Driver Code
public static void Main()
{
int[] arr = { 12, 5, 9, 21 };
int N = arr.Length;
bool ver = IsArrayGood(arr, N);
if (ver == true){
Console.Write("True");
}
else{
Console.Write("False");
}
}
}
// This code is contributed by gfgking
Javascript
True
时间复杂度: O(N*log(D)) 其中 D 是数组中的最大元素
辅助空间: O(1)