1103 Integer Factorization (30分)
思路
1.深度优先访问,当访问结点数超过K或者总和超过N时弹出;
2.设立两个列表,Visited保存访问路径上的结点,Result保存最终答案;
3.对于每个数字i对应的P次方打表,
4.搜索时 id 记录当前访问的数字,设立一个将id加入访问队列的分支,和另一不把id加入的分支
AC代码
#include<iostream>
#include<vector>
#include<math.h>
#include<algorithm>
using namespace std;
int N,K,P,MAX=-1;
vector<int> Visited;//访问中东元素
vector<int> Result;//保存结果
vector<int> NP;//打表
void DFS(int id,int num,int sum,int Vsum)
{
if(num>K||sum>N||id<=0) return;
if(num==K&&sum==N)
{
if(Vsum>MAX)
{
MAX=Vsum;
Result=Visited;
}
return;
}
Visited.push_back(id);
DFS(id,num+1,sum+NP[id],Vsum+id);
Visited.pop_back();
DFS(id-1,num,sum,Vsum);
}
void Table(int n)
{
for(int i=0;i<=n;i++)
{
NP.push_back(pow(i,P));
if(NP[i]>N)
{
NP.pop_back();
break;
}
}
}
int main()
{
scanf("%d%d%d",&N,&K,&P);
Table(N);
DFS(NP.size(),0,0,0);
if(Result.size()>0)
{
printf("%d = %d^%d",N,Result[0],P);
for(int i=1;i<Result.size();i++)
printf(" + %d^%d",Result[i],P);
}
else
printf("Impossible\n");
}