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

C++でnを0に減らすために必要な操作の数を見つけるプログラム


数nがあるとします。ここで、1。nを1つデクリメントする2. nが偶数の場合は、n / 2をデクリメントします。3。nが3で割り切れる場合は、2 *(n / 3)をデクリメントします。 nをゼロにデクリメントするために必要な操作の最小数。

したがって、入力がn =16の場合、出力は5になります。これは、n=16でもn/2を4倍減らすと、1になります。次に1を減らすと、0になります。合計5操作。

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

  • 1つのマップdpを定義する

  • 関数dfs()を定義します。これにはxが必要です

  • ret:=x

  • xがdpの場合、-

    • dp [x]

      を返します
  • x <=0の場合、-

    • xを返す

  • xが1と同じ場合、-

    • 1を返す

  • md2:=x mod 2

  • md3:=x mod 3

  • ret:=最小値{ret、md2 + 1 + dfs((x --md2)/ 2)、md3 + 1 + dfs((x --md3)/ 3)}

  • dp [x] =ret

    を返します
  • メインメソッドの呼び出しからdfs(n)を返します

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

#include <bits/stdc++.h>
using namespace std;
unordered_map <int, int> dp;
int dfs(int x){
   int ret = x;
   if(dp.count(x))
      return dp[x];
   if(x <= 0)
      return x;
   if(x == 1)
      return 1;
   int md2 = x % 2;
   int md3 = x % 3;
   ret = min({ret, md2 + 1 + dfs((x - md2) / 2), md3 + 1 + dfs((x - md3) / 3)});
   return dp[x] = ret;
}
int solve(int n) {
   return dfs(n);
}
int main(){
   int n = 16;
   cout << solve(n);
}

入力

16

出力

5

  1. 数の偶数の因数の合計を見つけるC++プログラム?

    このセクションでは、効率的な方法で、ある数のすべての素因数の合計を取得する方法を説明します。 n =480と言う数があります、これのすべての要因を取得する必要があります。 480の素因数は2、2、2、2、2、3、5です。すべての偶数の因数の合計は2 + 2 + 2 + 2 + 2 =10です。この問題を解決するには、この規則に従う必要があります。 − 数値が2で割り切れる場合は、それらを合計に加算し、数値を2で繰り返し除算します。 今、数は奇数でなければなりません。したがって、均等な要素は見つかりません。次に、それらの要因を単に無視します。 より良いアイデアを得るためのアル

  2. 再帰を使用して数値の階乗を見つけるC++プログラム

    非負の整数nの階乗は、n以下のすべての正の整数の積です。 例:4の階乗は24です。 4! = 4 * 3 * 2 *1 4! = 24 整数の階乗は、再帰プログラムまたは反復プログラムを使用して見つけることができます。 次のプログラムは、数値の階乗を見つけるための再帰プログラムを示しています- 例 #include <iostream> using namespace std; int fact(int n) {    if ((n==0)||(n==1))    return 1;    else   &