#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
int n,k,p;
int maxsum=0;
int num[21];//n最大400,当p最小为2时,最大的k为20
vector<int> tempfacs,optfacs;
int powerfac(int n,int p){//n的p次方
int prod=1;
for(int i=0;i<p;i++){
prod*=n;
}
return prod;
}
void initnum(){
for(int i = 1; i < 21; i++){
num[i] = powerfac(i,p);
}
}
void DFS(int s, int k, int n, int sum){//s为起始遍历的因子,k、n、sum即为字面意思
if(k == 0){
if(n == 0 && sum >= maxsum){
maxsum = sum;
optfacs=tempfacs;
}
}
else{
if(n > 0){
for(int i = s; i < 21; i++){
if(n < num[i]) break;
tempfacs.push_back(i);
DFS(i, k - 1, n - num[i], sum + i);
tempfacs.pop_back();
}
}
}
}
int main(){
cin>>n>>k>>p;
initnum();
DFS(1, k, n, 0);
if(optfacs.empty()){
printf("Impossible");
}
else{
printf("%d = ",n);
for(int i = k - 1; i >= 0; i--){
if(i != k - 1) printf(" + ");
printf("%d^%d",optfacs[i],p);
}
}
return 0;
}
1103. Integer Factorization (30)
最新推荐文章于 2018-11-02 22:55:36 发布
本文介绍了一种通过将整数n分解成若干个因子的p次幂之和的形式,并寻找最优分解方案的算法实现。该算法使用了深度优先搜索(DFS)策略来遍历所有可能的分解组合,以找到使得因子总和最大的分解方式。
109

被折叠的 条评论
为什么被折叠?



