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

Javaの真ん中で会う


配列と合計値が提供されます。問題の説明は、指定された合計値を超えない最大サブセット合計を計算することです。指定された配列の構造は分割統治法と同じではないため、ここでは力ずくのアプローチを適用できません。

このためのさまざまな入出力シナリオを見てみましょう-

例を挙げて理解しましょう

入力 − long arr [] ={21、1、2、45、9、8} long give_Sum =12

出力 -合計が指定された合計以下の最大合計サブセット->12

説明 -アレイは2つのサブセットのセットに分割されます。最初の要素はn/2で、後者の要素は残りです。最初のサブセットのすべての可能なサブセットの合計が計算されて配列Aに格納され、同様に、後のサブセットのサブセットの合計が計算されて配列Bに格納されます。最後に、2つのサブ問題がマージされ、それらの合計が以下になります。与えられた合計に。

入力 − long arr [] ={2、12、16、25、17、27} long give_Sum =24;

出力 -合計が指定された合計以下の最大合計サブセット->19

説明 -アレイは2つのサブセットのセットに分割されます。最初の要素はn/2で、後者の要素は残りです。最初のサブセットのすべての可能なサブセットの合計が計算されて配列Aに格納され、同様に、後のサブセットのサブセットの合計が計算されて配列Bに格納されます。最後に、2つのサブ問題がマージされ、それらの合計が以下になります。与えられた合計に。

以下のプログラムで使用されるアプローチは次のとおりです-

  • longデータ型の配列とlongデータ型の変数を作成し、10に設定します。関数をcalculateSubsetSum(arr、arr.length、given_Sum))として呼び出します。

  • メソッド内で、calculateSubsetSum(arr、arr.length、given_Sum))

    • メソッドをsolve_subarray(a、A、len / 2、0)およびsolve_subarray(a、B、len --len / 2、len / 2)として呼び出します

    • AとBのサイズを計算し、sort()メソッドを使用して配列Bを並べ替えます。

    • iから0までのループFORを開始し、iが配列Aのサイズより小さくなるまで。A[i]がgiven_Sumに等しいかどうかを確認し、get_lower_boundをcalculate_lower_bound(B、given_Sum --A [i])に設定します。 get_lower_boundto size_B OR B [get_lower_bound]が(given_Sum --A [i]))に等しくない場合は、get_lower_boundを1だけデクリメントします。

    • B [get_lower_bound] + A [i])がmaxより大きいかどうかを確認し、maxをB [get_lower_bound] +A[i]に設定します。

    • 最大値を返す

  • メソッド内で、solve_subarray(long a []、long x []、int n、int c)

    • iが(1 <

    • jがn未満になるまで、ループFORをjから0まで開始します。ループ内で、IF i&(1 <

    • x[i]を合計に設定

  • メソッド内で、calculate_lower_bound(long a []、long x)

    • 変数を左から-1、右から配列1の長さとして宣言します。

    • 左+1右より少ないWHILEでループを開始します。しばらくの間、mを(左+右)として設定します>>> 1. a [m]がxより大きいかどうかを確認してから、右をmに設定します。

    • それ以外の場合は、左をmに設定します。

    • 右に戻ります。

import java.util.*;
import java.lang.*;
import java.io.*;
public class testClass{
   static long A[] = new long[2000005];
   static long B[] = new long[2000005];
   static void solve_subarray(long a[], long x[], int n, int c){
      for (int i = 0; i < (1 << n); i++){
         long sum = 0;
         for (int j = 0; j < n; j++){
            if ((i & (1 << j)) == 0){
               sum += a[j + c];
            }
         }
         x[i] = sum;
      }
   }
   static long calculateSubsetSum(long a[], int len, long given_Sum){
      solve_subarray(a, A, len / 2, 0);
      solve_subarray(a, B, len - len / 2, len / 2);
      int size_A = 1 << (len / 2);
      int size_B = 1 << (len - len / 2);
      Arrays.sort(B);
      long max = 0;
      for (int i = 0; i < size_A; i++){
         if (A[i] <= given_Sum){
            int get_lower_bound = calculate_lower_bound(B, given_Sum - A[i]);
            if (get_lower_bound == size_B || B[get_lower_bound] != (given_Sum - A[i])){
               get_lower_bound--;
            }
            if((B[get_lower_bound] + A[i]) > max){
               max = B[get_lower_bound] + A[i];
            }
         }
      }
      return max;
   }
   static int calculate_lower_bound(long a[], long x){
      int left = -1, right = a.length;
      while (left + 1 < right){
         int m = (left + right) >>> 1;
         if (a[m] >= x){
            right = m;
         }
         else{
            left = m;
         }
      }
      return right;
   }
   public static void main(String[] args){
      long arr[] = { 21, 1, 2, 45, 9, 8 };
      long given_Sum = 12;
      System.out.println("The maximum sum subset having sum less than or equal to the given sum-->" + calculateSubsetSum(arr, arr.length, given_Sum));
   }
}

出力

上記のコードを実行すると、次の出力が生成されます

The maximum sum subset having sum less than or equal to the given sum-->12

  1. JavaでJOptionPaneメッセージダイアログの長いテキストを実装するにはどうすればよいですか?

    JOptionPane JComponentのサブクラスです 静的メソッドを含むクラス モーダルを作成およびカスタマイズするため ダイアログ ボックス 。 JOptionPane JDialogの代わりにクラスを使用できます クラス コードの複雑さを最小限に抑えるため。 JOptionPaneは、4つの標準アイコン(質問、情報、警告、)のいずれかを含むダイアログボックスを表示します。 およびエラー )またはユーザーが指定したカスタムアイコン。デフォルトでは、JOptionPaneメッセージダイアログは1行のテキストをサポートできます。 ong texを使用してJOptionPane

  2. JavaでのJavaSwingのアーキテクチャを説明しますか?

    Java Swing は、グラフィカルユーザーインターフェイス( GUI )を提供するAPIのセットです。 )Javaプログラムの場合。 Java Swingは、 Abstract Windows Toolkと呼ばれる以前のAPIに基づいて開発されました。 それ(AWT)。 Java Swingは、AWTよりも豊富で洗練されたGUIコンポーネントを提供します。 GUIコンポーネントは、単純なレベルから複雑なまでさまざまです。 ツリー およびテーブル 。 Java Swingは、プラグ可能なルックアンドフィールを提供します 基盤となるプラットフォームから独立したJavaプログラムのルックアンド