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