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

C++でのターゲット合計


非負の整数a1、a2、...、an、およびターゲットSという別の値のリストがあるとします。これで2つの記号+と-があります。 。整数ごとに、新しい記号として+と-から1つを選択する必要があります。整数の合計をターゲット値Sと同じにするためにシンボルを割り当てる方法がいくつあるかを調べる必要があります。したがって、数値が[1,1,1,1,1]で、S =3の場合、出力は次のようになります。 5、組み合わせは– 1 + 1 + 1 + 1 + 1 =3、+ 1 – 1 + 1 + 1 + 1 =3、+ 1 + 1 – 1 + 1 + 1 =3、+ 1 + 1 + 1 – 1 + 1 =3、+ 1 + 1 + 1 + 1 – 1 =3。したがって、それらを割り当てるには5つの方法があります。

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

  • サイズ21x2001のテーブルdpを1つ作成し、これに–1を入力します。これは動的計画法のアプローチに使用されます
  • solve()と呼ばれる再帰メソッドが使用されます。これには、pos、array v、tempSum、および実際の合計Sが必要です。これは次のように動作します-
  • posが配列vのサイズと同じ場合、s =tempSumの場合はtrueを返し、それ以外の場合はfalseを返します
  • dp [pos、tempSum + 1000]が-1でない場合は、dp [pos、tempSum+1000]を返します
  • ans:=resolve(pos + 1、v、tempSum – v [pos]、s)+ resolve(pos + 1、v、tempSum + v [pos]、s)
  • dp [pos、tempSum + 1000] =ans
  • 回答を返す
  • パラメータsolve(0、nums、0、s)を使用してメインセクションからsolve()を呼び出します
例(C ++)

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int dp[21][2001];
   int solve(int pos, vector <int> v, int tempSum, int s){
      if(pos == v.size()){
         return s == tempSum;
      }
      if(dp[pos][tempSum+1000]!=-1)return dp[pos][tempSum+1000];
      int ans = solve(pos+1,v,tempSum-v[pos],s) +solve(pos+1,v,tempSum+v[pos],s);
      dp[pos][tempSum+1000] = ans;
      return ans;
   }
   int findTargetSumWays(vector<int>& nums, int s) {
      int n = nums.size();
      if(s>1000)return 0;
      for(int i =0;i<21;i++){
         for(int j =0;j<2001;j++){
            dp[i][j] = -1;
         }
      }
      return solve(0,nums,0,s);
   }
};
main(){
   Solution ob;
   vector<int> v = {1,1,1,1,1};
   cout << ob.findTargetSumWays(v, 3);
}

入力

[1,1,1,1,1]
3

出力

5

  1. C ++の算術平均?

    算術平均は、数値の平均にすぎません。このプログラムでは、一連の数値から算術平均を見つける方法を説明します。関数は、設定された数と要素の数を受け取ります。アウトタスクは、各要素を追加し、それを渡された要素の数で割るだけです。 アルゴリズム 算術平均(データセット、n) begin    sum := 0    for each element e from dataset, do       sum := sum + e    done    return sum/n end 例 #in

  2. 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