C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C ++で指定された条件に従って、配列を等しい合計部分に分割します


ここで1つの問題が発生します。 1つの配列arrが指定されているとします。 -

のように、配列を2つの部分に分割できるかどうかを確認する必要があります。
  • 両方のサブアレイのサブは同じになります
  • 5の倍数であるすべての要素は、同じグループに含まれます
  • 3の倍数であるが、5の倍数ではないすべての要素は、同じグループに含まれます
  • 他のすべての要素は他のグループに含まれます。

配列要素が{1、4、3}であるとすると、これは分割できます。これは、{1、3}の合計が{4}の合計と同じであり、グループも指定された条件に対して正しいためです。

アルゴリズム

isSplitArray(arr、n、start、left_sum、right_sum)-

Begin
   if start = n, then return true when left_sum = right_sum, otherwise false
   if arr[start] is divisible by 5, then add arr[start] with the left_sum
   else if arr[start] is divisible by 3, then add arr[start] with the right_sum
   else
      return isSplitArray(arr, n, start + 1, left_sum + arr[start], right_sum) OR isSplitArray(arr, n, start + 1, left_sum, right_sum + arr[start])
   isSplitArray(arr, n, start + 1, left_sum, right_sum)
End

#include <iostream>
using namespace std;
bool isSplitArray(int* arr, int n, int start, int left_sum, int right_sum) {
   if (start == n) //when it reaches at the end
      return left_sum == right_sum;
   if (arr[start] % 5 == 0) //when the element is divisible by 5, add to left sum
      left_sum += arr[start];
   else if (arr[start] % 3 == 0) //when the element is divisible by 3 but not 5, add to right sum
         right_sum += arr[start];
   else // otherwise it can be added to any of the sub-arrays
         return isSplitArray(arr, n, start + 1, left_sum + arr[start], right_sum) || isSplitArray(arr, n, start + 1, left_sum, right_sum + arr[start]);
   // For cases when element is multiple of 3 or 5.
   return isSplitArray(arr, n, start + 1, left_sum, right_sum);
}
int main() {
   int arr[] = {1, 4, 3};
   int n = sizeof(arr)/sizeof(arr[0]);
   if(isSplitArray(arr, n, 0, 0, 0)){
      cout <<"Can be split";
   } else {
      cout <<"Can not be split";
   }
}

出力

Can be split

  1. Javaで指定されたクエリに基づいて、配列をサブ配列に分割した後の最大サブ配列の合計

    2つの整数配列が与えられます。1つは計算される要素を持ち、もう1つはサブセットを作成するために配列を分割するために必要な分割点を持ち、すべての分割で各サブセットの合計を計算し、最大サブセット合計を返す必要があります。 例を挙げて理解しましょう:- 入力 − int arr [] =int arr [] ={9、4、5、6、7} int splitPoints [] ={0、2、3、1}; 出力 −各分割後の最大サブアレイ合計[22、13、9、9] 説明 −ここでは、分割点に従って配列を分割し、各分割後に最大サブセット和を取得しています 最初の分割後サブアレイの最大合計は-22 2

  2. Pythonで合計が等しい3つの部分に配列を分割する

    整数の配列Aがあるとすると、合計が等しい3つの空でない部分に配列を分割できる場合にのみ、出力はtrueになります。 正式には、(A [0] + A [1] + ... +A[i]がA[i+ 1] + A[と同じであるインデックスi+1