#include <iostream>
#include <vector>
#include <string>
#include <stdlib.h>
#include <math.h>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <algorithm>
using namespace std;
int N,K,P;
map<int ,int> m_pow;
vector<int> finalfactors;
int maxsum =0;
vector<int> factors;
int mypow(int b,int p)
{
int r =1;
while(p--)
r*=b;
return r;
}
void factorizable(int n,int k)
{
if(k==0)
{
if(n==0)
{
int sum =0;
for(int i=0;i<factors.size();i++)
{
sum += factors[i];
}
if(sum >=maxsum)
{
maxsum = sum;
finalfactors = factors;
}
}
}
else
{
if(n<=0)
return;//剪枝
int start = factors.size()>0? factors.back():1; //剪枝
for(int i=start;i<=20;i++)
{
if(n - m_pow[i] <0)
break;//剪枝
factors.push_back(i);
factorizable( n - m_pow[i], k-1 );
factors.pop_back();
}
}
}
int main(void)
{
cin>>N>>K>>P;
for(int i=1;i<=20;i++)
{
int r = mypow(i,P);
m_pow.insert(make_pair(i,r));
}
factorizable(N,K);
reverse(finalfactors.begin(),finalfactors.end());
if(finalfactors.size()==K)
{
cout<<N<<" = "<<finalfactors[0]<<"^"<<P;
for(int i=1;i<K;i++)
cout<<" + "<<finalfactors[i]<<"^"<<P;
cout<<endl;
}
else cout<<"Impossible"<<endl;
//system("pause");
return 0;
}
[PAT]1103. Integer Factorization (30)
最新推荐文章于 2020-04-12 10:41:05 发布