factorization 因子分解
1、首先判断是dfs深度优先搜索。
2、打个表,把从0-sqrt(n)之间数的平方值都存入
3、构思dfs(模板)
>1 思考每次操作后改变的,将变量作为参数。
那么这里的变量有 目前处理的值,值的个数,值的P次方总和,值的总和
>2 得到答案的情况
>3 剪枝的情况
>4 处理,要or不要
4、题目中要求的序列大小 直接从大到小dfs即可。
#include<bits/stdc++.h>
using namespace std;
vector<int> fac;
int n,k,p;
void init(){
for(int i=0;pow(i,p)<=n;i++){
fac.push_back(pow(i,p));
}
}
vector<int> temp,ans;
int maxsum=-1;//要求
/*每次的变量:当前处理的值index
当前的P和sumP
当前的个数nowK
当前的和sum
*/
void dfs(int index,int nowK,int sumP,int sum){
//答案
if(nowK==k&&sumP==n){
if(sum>maxsum){
ans=temp;maxsum=sum;
}
return;
}
//非法,剪枝
if(nowK>k||sumP>n||index<1) return;
//填入,选或不选
temp.push_back(index);
dfs(index,nowK+1,sumP+fac[index],sum+index);
temp.pop_back();
dfs(index-1,nowK,sumP,sum);
}
int main(){
cin>>n>>k>>p;
init();
dfs(fac.size()-1,0,0,0);
if(maxsum==-1) printf("Impossible");
else{
printf("%d =",n);
for(int i=0;i<ans.size();i++){
printf(" %d^%d",ans[i],p);
if(i!=ans.size()-1) printf(" +");
}
}
return 0;
}