DFS+枝剪 。
这个题发现了一问题。。
PAT上面编译器直接用vecto 类型进行比较的时候结果不对:
例如:
vector <int> a1;
vector <int> a2;
我这里用的VS2015 可以直接 a1>a2进行依次判定,但是PAT的编译器上面这样会出现问题,必须自己写个循环来判定。
#include <iostream>
#include <vector>
#include <cmath>
#define MAX 410
using namespace std;
int n, k, p;
int Ni_P[MAX];
int npow(int n,int p) {
int sum = n;
while (--p) {
sum *= n;
}
return sum;
}
struct Ans {
int sum;
vector <int> factor;
bool operator > (const Ans a2) {
if (sum != a2.sum)
return sum > a2.sum;
else {
for (int i = 0; i < k; i++) {
return factor[i] > a2.factor[i];
}
}
}
Ans(){ sum = 0; }
};
Ans ThisAns, FinAns;
void DFS(int st ,int sum,int level,int max_Ni) {
for (int i = st; i <= max_Ni; i++) {//数字递增
int t_sum = sum + Ni_P[i];
int TempSum;
if (t_sum > n) //已经大了
return;
else if (t_sum < n && level == k)//次数到了还不够
continue;
else if (t_sum == n && level == k) {
ThisAns.factor.push_back(i);
TempSum = ThisAns.sum;
ThisAns.sum += i;
if (ThisAns > FinAns)
FinAns = ThisAns;
//回溯
ThisAns.sum = TempSum;
ThisAns.factor.pop_back();
return;
}
else {
ThisAns.factor.push_back(i);
TempSum = ThisAns.sum;
ThisAns.sum += i;
DFS(i,t_sum, level + 1, max_Ni);//递增 一定大于等于当前i
//回溯
ThisAns.sum = TempSum;
ThisAns.factor.pop_back();
}
}
}
int main() {
cin >> n >> k >> p;
int Ni = 1, pos = 1;
int sum = Ni_P[pos] = 1;
while (sum < n) {
sum = npow(Ni++, p);
Ni_P[pos++] = sum;
}
DFS(1, 0, 1, pos);
if (FinAns.factor.size() == k) {
cout << n << " = " << FinAns.factor[k - 1] << "^" << p;
for (int i = k - 2; i >= 0; i--) {
cout << " + " << FinAns.factor[i] << "^" << p;
}
cout << endl;
}
else
cout << "Impossible" << endl;
return 0;
}