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

C++で合計が等しい2つのセットの最大合計を見つけるプログラム


numsと呼ばれる数値のリストがあるとします。ここで、合計が同じで最大である2つのセットを見つけてから、合計値を見つけます。

したがって、入力がnums =[2、5、4、6]の場合、セットは[2、4]と[6]であるため、出力は6になります。

これを解決するには、次の手順に従います-

  • 合計:=0
  • numsの各数値iについて、
    • sum:=sum + i
  • n:=numsのサイズ
  • サイズ(n + 1)x(2*合計+5)の2D配列dpを1つ定義し、-1で埋めます
  • dp [0、sum]:=0
  • iを初期化する場合:=1、i <=nの場合、更新(iを1つ増やす)、実行-
    • x:=nums [i-1]
    • jを初期化する場合:=0、j <2 * sum + 5の場合、更新(jを1増やす)、実行-
      • j --x> =0で、dp [i -1、j --x]が-1に等しくない場合、^ −
        • dp [i、j]:=最大dp [i、j]および(dp [i-1、j-x] + x)
      • j + x <(2 * sum + 5)であり、dp [i-1、j + x]が-1に等しくない場合、-
        • dp [i、j]:=最大dp [i、j]および(dp [i-1、j + x])
      • dp [i、j]:=最大dp [i、j]およびdp [i-1、j]
  • return dp [n、sum]

例(C ++)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int solve(vector<int>& nums) {
      int sum = 0;
      for (int i : nums) sum += i;
      int n = nums.size();
      vector<vector<int> > dp(n + 1, vector<int>(2 * sum + 5, -1));
      dp[0][sum] = 0;
      for (int i = 1; i <= n; i++) {
         int x = nums[i - 1];
         for (int j = 0; j < 2 * sum + 5; j++) {
            if (j - x >= 0 && dp[i - 1][j - x] != -1) {
               dp[i][j] = max(dp[i][j], dp[i - 1][j - x] + x);
            }
            if (j + x < 2 * sum + 5 && dp[i - 1][j + x] != -1) {
               dp[i][j] = max(dp[i][j], dp[i - 1][j + x]);
            }
            dp[i][j] = max(dp[i][j], dp[i - 1][j]);
         }
      }
      return dp[n][sum];
   }
};
int solve(vector<int>& nums) {
   return (new Solution())->solve(nums);
}
main(){
   vector<int> v = {2, 5, 4, 6};
   cout << solve(v);
}

入力

{2, 5, 4, 6}

出力

6

  1. 2つの数値を追加するC++プログラム

    加算は基本的な算術演算です。 2つの数値を加算するプログラムは、2つの数値の加算を実行し、それらの合計を画面に出力します。 2つの数字の加算を示すプログラムは次のとおりです- 例 #include <iostream> using namespace std; int main() {    int num1=15 ,num2=10, sum;    sum = num1 + num2;    cout<<"Sum of "<<num1<<" and &q

  2. Pythonで重複しない2つのサブリストの最大合計を見つけるプログラム

    numsと呼ばれる数値のリストと2つの値xおよびyがあるとすると、長さxおよびyを持つnums内の重複しない2つのサブリストの最大合計を見つける必要があります。 したがって、入力がnums =[3、2、10、-2、7、6] x =3 y =1の場合、出力は22になります。これは、長さが3のサブリストとして[3、2、 10]と、その他には[7]を選択します。 これを解決するには、次の手順に従います- P:=単一要素0のリスト Aのxごとに、 Pの最後に(P + xの最後の要素)を挿入します 関数solve()を定義します。これにはlen1、len2が必要です Q:=範囲0からP