因为本题有一个index变成index-1的过程,所以这个index一定要大于0,而index内容最小的值为1,所以要注意v的取值
#include<cstdio>
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int n,k,p,maxF=-1;
vector<int> v,ans,temp;
void init()
{
int t=0,cnt=1;
while(t<n)
{
v.push_back(t);
t=pow(cnt++,p);
}
}
void DFS(int index,int nowK,int nowN,int sumF)
{
if(nowK==k&&nowN==n)
{
if(sumF>maxF)
{
maxF=sumF;
ans=temp;
}
return ;
}
if(nowK>k||nowN>n)return;
if(index>0)
{
temp.push_back(index);
DFS(index,nowK+1,nowN+v[index],sumF+index);
temp.pop_back();
DFS(index-1,nowK,nowN,sumF);
}
}
int main()
{
cin>>n>>k>>p;
init();
DFS(v.size()-1,0,0,0);
if(maxF==-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(" + ");
}
}
}
本文介绍了一种使用递归算法求解特定数学组合问题的方法。通过初始化一个数列并利用深度优先搜索(DFS)策略,算法寻找满足条件的组合,即找到k个数的p次方之和等于n的所有可能情况。该方法适用于解决类似数学问题,如将一个数表示为若干个数的幂次方之和。

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



