这道题值得反复看
深度优先搜索解决
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
vector<vector<int>> res;
bool cmp(vector<int>& vector1,vector<int>& vector2){
int sum1=0,sum2=0;
for(auto x:vector1){
sum1+=x;
}
for (auto x:vector2){
sum2+=x;
}
if(sum1==sum2){
for (int i = 0; i < vector1.size(); ++i) {
if(vector1[i]!=vector2[i]){
return vector1[i]>vector2[i];
}
}
}
return sum1>sum2;
}
int fun1(int x,int P){
int i1=x;
for (int i = 1; i < P; ++i) {
i1=i1*x;
}
return i1;
}
void dfs(int index,int target,int remain,int* powers,vector<int> & vector1){//此处index数据必须添加
if (remain==0){//这个可以去掉了
return;
}
vector1.push_back(index);//添加入当前位置数据
target=target-powers[index];//目标数据减少
remain--;//剩余数量减少
if (remain==0&&target==0){
vector<int> vector2(vector1);
res.push_back(vector2);
vector1.pop_back();
return;
}
if (target > 0&&remain>=1){
for (int i = index; i >= 1; --i) {
dfs(i, target , remain, powers,vector1);
}
}
vector1.pop_back();
}
int main() {
int N,K,P;
cin>>N>>K>>P;
int maxIndex=int(sqrt(N));
int powers[maxIndex+2];
for (int i = 0; i <= maxIndex; ++i) {
powers[i]=fun1(i,P);
}
vector<int> vector1;
for (int i = maxIndex; i >=1 ; --i) {
dfs(i,N,K,powers,vector1);
}
if(res.empty()){
cout<<"Impossible"<<endl;
return 0;
}
sort(res.begin(),res.end(),cmp);
vector1=res[0];
cout << N << " = "<<vector1[0]<<"^"<<P;
for (int i = 1; i < vector1.size(); ++i) {
cout<<" + "<<vector1[i]<<"^"<<P;
}
cout<<endl;
return 0;
}
#include <iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
int N,num,K;
int sum=0;
vector<vector<int>> res;
vector<int> temp;
int findMax(int N){
int i=0;
while(pow(i,K)<=N){
i++;
}
return i;
}
int findval(int N){
for(int i=1;i<=N;i++){
int val=pow(i,K);
if(val==N){
return i;
}
}
}
bool cmp(vector<int>& v1,vector<int>& v2){
int sum1=0,sum2=0;
for(auto x:v1){
sum1+=x;
}
for(auto y:v2){
sum2+=y;
}
if(sum1!=sum2){
return sum1>sum2;
}
int len1=v1.size();
for(int i=0;i<len1;i++){
if(v1[i]!=v2[i]){
return v1[i]>v2[i];
}
}
return true;
}
void dfs(int index,int* powers,int numIndex){
sum+=powers[index];
temp.push_back(powers[index]);
if(temp.size()>num){
}else if(sum==N&&temp.size()==num){
vector<int> v;
v=temp;
res.push_back(v);
}else if(sum<N){
for(int i=index;i<=numIndex;i++){
if(sum+powers[i]<=N){
dfs(i,powers,numIndex);
}else{
break;
}
}
}
sum-=powers[index];
temp.pop_back();
}
int main()
{
cin>>N>>num>>K;
int maxIndex=findMax(N);
int powers[maxIndex+2];
for(int i=1;i<=maxIndex;i++){
powers[i]=pow(i,K);
}
for(int i=1;i<=maxIndex;i++){
dfs(i,powers,maxIndex);
}
sort(res.begin(),res.end(),cmp);
if(res.size()==0){
cout<<"Impossible"<<endl;
}else{
vector<int> v=res[0];
cout<<N<<" =";
bool first=true;
for(int i=v.size()-1;i>=0;i--){
int val=findval(v[i]);
if(!first){
cout<<" + "<<val<<"^"<<K;
}else{
cout<<" "<<val<<"^"<<K;
first=false;
}
}
}
return 0;
}