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

C++を使用してNを合計として表現するために必要なパリンドロームの最小数。


問題の説明

数Nが与えられた場合、Nをそれらの合計として表現するために必要な回文数の最小数を見つける必要があります

N =15の場合、2つの回文、つまり8と7が必要です。

アルゴリズム

1. Generate all the palindromes up to N in a sorted fashion
2. Find the size of the smallest subset such that its sum is N

#include <iostream>
#include <vector>
#include <climits>
#include <algorithm>
using namespace std;
vector<vector<long long>> table;
int createPalindrome(int input, bool isOdd){
   int n = input;
   int palindrome = input;
   if (isOdd)
      n /= 10;
   while (n > 0) {
      palindrome = palindrome * 10 + (n % 10);
      n /= 10;
   }
   return palindrome;
}
vector<int>generatePalindromes(int n){
   vector<int> palindromes;
   int number;
   for (int j = 0; j < 2; j++) {
      int i = 1;
      while ((number = createPalindrome(i++, j)) <= n)
         palindromes.push_back(number);
   }
   return palindromes;
}
long long minSubsetSize(vector<int>& vec, int i, int j, int n){
   if (n == 0)
   return 0;
   if (i > j || vec[i] > n)
   return INT_MAX;
   if (table[i][n])
   return table[i][n];
   table[i][n] = min(1 + minSubsetSize(vec, i + 1, j, n - vec[i]), minSubsetSize(vec, i + 1, j, n));
   return table[i][n];
}
int requiredPalindromes(int n){
   vector<int> palindromes = generatePalindromes(n);
   sort(palindromes.begin(), palindromes.end());
   table = vector<vector<long long>>(palindromes.size(),
   vector<long long>(n + 1, 0));
   return minSubsetSize(palindromes, 0, palindromes.size() - 1, n);
}
int main(){
   int n = 15;
   cout << "Minimum required palindromes = " <<
   requiredPalindromes(n) << endl;
   return 0;
}

出力

上記のプログラムをコンパイルして実行する場合。次の出力を生成します-

Minimum required palindromes = 2

  1. C ++を使用して、数の因数の最小合計を求めます。

    ここでは、与えられた数の因子の最小合計を取得する方法を見ていきます。数が12であると仮定します。これはさまざまな方法で因数分解できます- 12 =12 * 1(12 + 1 =13) 12 =2 * 6(2 + 6 =8) 12 =3 * 4(3 + 4 =7) 12 =2 * 2 * 3(2 + 2 + 3 =7) 最小の合計は7です。数値を取り、最小の因子の合計を見つけようとします。最小の因数分解の合計を取得するには、可能な限り数を因数分解する必要があります。言い換えれば、素因数を足して合計Sを求めようとすると、その合計は最小化されると言えます。 例 #include<

  2. C++で最小ページ数を割り当てます

    最小ページ数を割り当てることはプログラミングの問題です。この問題について詳しく話し合い、解決策を見つけましょう。 ステートメント n冊の異なる本のページ数が与えられます 。また、m人の学生がいます 書籍の割り当て先。本はページ数の昇順で並べられています。そして、すべての学生にいくつかの連続した本を割り当てることができます。プログラムは、学生が読んだ最大ページ数を返す必要があります。これは最小でなければなりません。 この問題をよりよく理解するために例を見てみましょう。 Input : books[] = {13 , 43, 65, 87, 92}    m = 2 Out