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

C++で指定された合計の最大サイズサブセット


問題の説明

N個の要素と合計の配列が与えられます。合計が与えられた合計に等しい最大サイズのサブセットのサイズを見つける必要があります

入力配列がarr={2、3、5、10}でsum =20の場合、出力は-

として4になります。

2 + 3 + 5 + 10=20これは与えられた合計に等しい

アルゴリズム

動的計画法を使用してこの問題を解決できます。

最大サブセットをカウントするには、別のDP配列(「カウント配列」と呼ばれます)を使用します。ここで、count[i][j]は最大です。

  • count[i][j-1]。ここでは、現在の要素は考慮されていません。
  • scount [i- X] [j-1] +1。ここで、Xはサブセット用に選択された現在の要素の値です。

#include<bits/stdc++.h>
using namespace std;
int isSubsetSum(int set[], int n, int sum) {
   bool subset[sum + 1][n + 1];
   int count[sum + 1][n + 1];
   for (int i = 0; i <= n; i++) {
   subset[0][i] = true;
      count[0][i] = 0;
   }
   for (int i = 1; i <= sum; i++) {
      subset[i][0] = false;
      count[i][0] = -1;
   }
   for (int i = 1; i <= sum; i++) {
      for (int j = 1; j <= n; j++) {
         subset[i][j] = subset[i][j - 1];
         count[i][j] = count[i][j - 1];
         if (i >= set[j - 1]) {
            subset[i][j] = subset[i][j] || subset[i - set[j - 1]][j - 1];
            if (subset[i][j]) {
               count[i][j] = max(count[i][j - 1], count[i - set[j - 1]][j - 1] + 1);
            }
         }
      }
  }
  return count[sum][n];
}
int main() {
   int set[] = { 2, 3, 5, 10 };
   int sum = 20;
   int n = 4;
   cout<< "Result = " << isSubsetSum(set, n, sum) << endl;
}

出力

上記のプログラムをコンパイルして実行する場合。次の出力を生成します-

Result = 4

  1. 最大サイズ2の最小パーティションと、C++で指定された値によって制限される合計

    問題の説明 正の数の配列arr[]が与えられた場合、次のプロパティを満たす配列内のセットの最小数を見つけます。 セットには、最大2つの要素を含めることができます。 2つの要素は連続している必要はありません。 セットの要素の合計は、指定されたキー以下である必要があります。与えられたキーが最大の配列要素以上であると想定される場合があります。 例 arr [] ={1、2、3、4}およびk =5の場合、次の2つのペアを作成できます- {1、4}および{2、3} アルゴリズム 配列を並べ替える ソートされた配列の2つのコーナーから2つのポインターを開始します。それらの合計が指定されたキー

  2. C ++を使用して、マトリックス内の合計が最大の列を検索します。

    サイズがMxNの行列があるとします。合計が最大の列を見つける必要があります。このプログラムでは、トリッキーなアプローチには従わず、配列を列ごとにトラバースし、各列の合計を取得します。合計が最大の場合は、合計と列インデックスを出力します。 例 #include<iostream> #define M 5 #define N 5 using namespace std; int colSum(int colIndex, int mat[M][N]){    int sum = 0;    for(int i = 0; i<M; i++){