C++でのパーティションの等しいサブセット和
正の数のみを含む空でない配列があるとすると、両方のサブセットの要素の合計が同じになるように、配列を2つのサブセットに分割できるかどうかを確認する必要があります。したがって、入力が[1,5,11,5]のような場合、出力はtrueになります。この配列は[1、5、5]および[11]
として分割できるためこれを解決するには、次の手順に従います-
- n:=配列のサイズ
- 合計:=0
- for i:=0からn– 1
- sum:=sum + nums [i]
- 合計が奇数の場合、falseを返します
- 合計:=合計/ 2
- サイズ合計+1のdpという1つの配列を作成します
- dp [0]:=true
- 0からn–1の範囲のiの場合
- x:=nums [i]
- for j:=合計をj – x
- dp [j]:=dp[j]またはdp[j--x]、これは0ではありません
- return dp [sum]
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; class Solution { public: bool canPartition(vector<int>& nums) { int n = nums.size(); int sum = 0; for(int i =0;i<n;i++)sum+=nums[i]; if(sum&1)return false; sum/=2; vector <bool> dp(sum+1); dp[0] = true; for(int i =0;i<n;i++){ int x = nums[i]; for(int j =sum;j-x>=0;j--){ dp[j]=dp[j] || dp[j-x]; } } return dp[sum]; } }; main(){ Solution ob; vector<int> v = {1,5,11,5}; cout << ob.canPartition(v); }
入力
[1,5,11,5]
1
-
C++での等しいツリーパーティション
n個のノードを持つ二分木があるとすると、元のツリーの1つのエッジを削除した後、値の合計が等しい2つのツリーにツリーを分割できるかどうかを確認するタスクがあります。 したがって、入力が次のような場合 そうすれば、出力は真になります。 これを解決するには、次の手順に従います- 1つのスタックstを定義する 関数solve()を定義します。これはノードを取ります ノードがnullの場合、- 0を返す leftSum:=solve(ノードの左側) rightSum:=solve(ノードの権利) curr:=val + leftSum+rig
-
C ++でのアリコートの合計?
ここで、アリコートの合計は何ですか? nのアリコート和は、nを除くnのすべての完全な因子の合計です。たとえば、数値が20の場合、完全な因数は(1、2、4、5、10)です。したがって、アリコートの合計は22です。 興味深い事実の1つは、ある数のアリコートの合計がその数そのものである場合、その数は完全数であるということです。たとえば、6。係数は(1、2、3)です。アリコートの合計は1+2 + 3=6です。 次のアルゴリズムを使用してアリコートの合計を取得する方法を見てみましょう。 アルゴリズム getAliquotSum(n) begin sum := 0 &nbs