①栈中会保存每次dfs递归选择的结果,因此不应该定义在dfs函数内
②递归边界除了满足条件外,不满足条件的除了题目给的不能大于sum,不能大于k位数,还有index不能大于n,因为存在一直不选的情况,而出现段错误。
③下边的dfs的问题:index不是累加,是连乘,而且最好把它作为一个函数写在dfs外边。 ans[num++][i]=v[i];每次付完值都会调到下一行,在【】里的++慎用,应该等一行付完值后再num++
int n,k,p,ans[440][440],num=0,sum=0,nowk=0;
vector<int> v; //不能定义在dfs中
void dfs(int index,int sum,int nowk)
{
if(sum==n&&nowk==k)
{
for(int i=0;i<v.size();i++)
ans[num++][i]=v[i];
return;
}
if(sum>n||nowk>k||index>n) return;
v.push_back(index);
for(int i=0;i<p;i++)
sum+=index;
dfs(index,sum,nowk+1);
v.pop_back();
for(int i=0;i<p;i++)
sum-=index;
dfs(index+1,sum,nowk);
}
三个测试点运行超时:要求底数相同则输出字典序大的,那么应该从max^p开始递减的查找index,那么底数和相同的情况下,ans肯定保存的字典序大的,
void dfs(int index,int sum,int nowk)
{
if(sum==n&&nowk==k)
{
for(int i=0;i<v.size();i++)
ans[num][i]=v[i];
num++;
return;
}
if(sum>n||nowk>k||index>n) return;
v.push_back(index);
dfs(index,sum+w(index),nowk+1);
v.pop_back();
dfs(index+1,sum,nowk);
}
把nowk写成了k,直接检查,走一遍
#include<bits/stdc++.h>
using namespace std;
int n,k,p,maxfac=-1;
vector<int> temp,ans,ip;
void init() //避免重复计算
{
int b=1;
while(pow(b,p)<=n)
{
ip.push_back(pow(b,p));
b++;
}
}
void dfs(int index,int sum,int nowk,int tempfac)
{
if(nowk==k&&sum==n)
{
if(tempfac>maxfac)
{
ans=temp;
maxfac=tempfac;
}
return;
}
if(sum>n||nowk>k) return;
if(index>0)
{
temp.push_back(index);
dfs(index,sum+ip[index-1],nowk+1,tempfac+index);
temp.pop_back();
dfs(index-1,sum,nowk,tempfac);
}
}
int main()
{
cin>>n>>k>>p;
init();
dfs(ip.size(),0,0,0);
if(maxfac==-1) printf("Impossible\n");
else{
printf("%d = %d^%d",n,ans[0],p);
for(int i=1;i<ans.size();i++)
printf(" + %d^%d",ans[i],p);
}
return 0;
}