-
首先要考虑递归的方向。题目要求,如果有多种方案,选择底数和n1+…nk最大的方案;如果还有多重方案,那么选择底数序列的字典序最大的方案。
因此从大到小递减来遍历,保证字典序大的序列优先被选中。 -
两条分支: 选index号元素,DFS(index,nowk+1,sum+fac[index],facSum+index);
DFS(index-1,nowk,sum,facSum); //不选index,因此要考虑index-1(因为从大到小遍历,所以下一个要考虑的是index-1)
#include<bits/stdc++.h>
using namespace std;
int n,k,p;
vector<int> fac,maxSeq,temp;
int maxSum=-1;
int Pow(int x)
{
int res=1;
for(int i=0;i<p;i++)
{
res*=x;
}
return res;
}
void init()
{
// int i=0,temp=0;
// while (temp<=n)
// {
// fac.push_back(temp);
// temp= Pow(++i);
// }
for(int i=0;i<n;i++)
{
if(Pow(i)>n) break;
fac.push_back(Pow(i));
}
}
void DFS(int index,int nowk,int sum,int facSum)
{
if(nowk==k&&sum==n)
{
if(facSum>maxSum)
{
maxSeq=temp;
maxSum=facSum;
}
return;
}
if(sum>n||nowk>k) return;
if(index>=1) //接下来就是看index选还是不选 所以还是要设置index条件的
{
temp.push_back(index); //让index从大到小递减进行遍历
DFS(index,nowk+1,sum+fac[index],facSum+index);
temp.pop_back();
DFS(index-1,nowk,sum,facSum); //不选index,因此要考虑index-1
}
}
int main()
{
scanf("%d%d%d",&n,&k,&p);
init();
DFS(fac.size()-1,0,0,0);
if(maxSum==-1) printf("impossible");
else
{
printf("%d=%d^%d",n,maxSeq[0],p);
for(int i=1;i<maxSeq.size();i++)
{
printf("+%d^%d",maxSeq[i],p);
}
}
}