使用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

以上是 使用C ++将N表示为总和所需的最小回文数。 的全部内容, 来源链接: utcz.com/z/338084.html

回到顶部