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]
- j --x> =0で、dp [i -1、j --x]が-1に等しくない場合、^ −
- 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
-
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
-
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