題目鏈接:點擊這裏
深度優先搜索的詳細介紹及代碼:點擊這裏
#include<iostream>
#include<algorithm>
#include<string>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
using namespace std;
typedef long long ll;
const int MOD = 10000007;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const int maxn = 1010;
//n,k,p如題所述,maxFacSum記錄最大底數之和
int n,k,p,maxFacSum=-1;
//fac記錄0^p,1^p,…i^p,使得i^p爲不超過n的最大數
//ans存放最優底數序列,temp存放遞歸中的臨時底數序列
vector<int> fac,ans,temp;
//power函數計算x^p
int power(int x)
{
int ans = 1;
for(int i=0;i<p;i++)
ans *= x;
return ans;
}
//init函數預處理fac數組,注意把0也存進去
void init()
{
int i=0,temp=0;
while(temp<=n)
{
fac.push_back(temp);
temp = power(++i);
}
}
//DFS函數,當前訪問fac[index],nowK爲當前選中個數
//sum爲當前選中的數之和,facSum爲當前選中的底數之和
void DFS(int index,int nowK,int sum,int facSum)
{
if(sum==n&&nowK==k) //找到一個滿足的序列
{
if(facSum>maxFacSum) //底數之和更優
{
ans = temp; //更新最優底數序列
maxFacSum = facSum; //更新最大底數之和
}
return;
}
if(sum>n||nowK>k) //這種情況下不會產生答案,直接返回
return;
if(index-1>=0) //fac[0]不需要選擇
{
temp.push_back(index); //把底數index加入臨時序列temp
DFS(index,nowK+1,sum+fac[index],facSum+index); //"選"的分支
temp.pop_back(); //"選"的分支結束後把剛加進去的數pop掉
DFS(index-1,nowK,sum,facSum); //"不選"的分支
}
}
int main()
{
scanf("%d%d%d",&n,&k,&p);
init(); //初始化fac數組
DFS(fac.size()-1,0,0,0); //從fac的最後一位開始往前搜索
if(maxFacSum==-1) //沒有找到滿足的序列
{
printf("Impossible\n");
}
else
{
printf("%d = %d^%d",n,ans[0],p); //輸出ans的結果
for(int i=1;i<ans.size();i++)
printf(" + %d^%d",ans[i],p);
}
return 0;
}