这是最后看了答案之后修改的:
#include <iostream>
#include <string>
#include <set>
#include <map>
#include<queue>
#include<stack>
#include<algorithm>
#include<cmath>
//new and delete
//A1103 Integer Factorization
using namespace std;
typedef int ElemType ;
vector <int> fac; //记录不超过N的n^P, dac[1]=1^P; fac[2]=2^P;
vector<int> ans, temp; //ans最优序列,temp临时序列
int ans_sum=-1; //ans的底数之和
int N, K, P;
/*
index: 当前处理的是fac[index];
nowK: 当前选择了几个数;
sum: 当前选择的总和
facsum: 当前选择的底数之和 " the maximum sum of the factors."*/
void DFS(int index, int nowK, int sum, int facsum) {
//cout << index << endl;
//如果nowK>K或者index<1或者sum>N
if (nowK > K || index<1 || sum>N) {
return;
}
if (nowK == K && sum == N) {//符合条件的序列
if (facsum > ans_sum) {
ans_sum = facsum;
ans = temp;
}
return;
}
//选index号数
temp.push_back(index);
DFS(index, nowK + 1, sum + fac[index], facsum + index);
temp.pop_back();
//不选index号数
DFS(index - 1, nowK, sum, facsum);
return;
}
int main() {
/*fac.clear();
temp.clear();
ans.clear();
ans_sum = -1;*/
cin >> N >> K >> P;
//记录不超过N的n^P数组fac, fac[0]=0;fac[1]=1;
int i = 0;
while (1) {
int temp = pow(i, P);
if (temp > N)
break;
fac.push_back(temp);
i++;
}
DFS(fac.size() - 1, 0,0, 0);
//无解
if (ans_sum == -1) {
cout << "Impossible\n";
}
else {
//有解
cout << N << " = ";
for (i = 0; i < ans.size(); i++) {
cout << ans[i] << "^"<<P;
if (i < ans.size() - 1)
cout << " + ";
}
cout << endl;
}
return 0;
}
下面是最开始根据算法自己写的,这个第三个数据怎么都通过不了。
主要区别是第一种方法分为选和不选,简化了代码,但是思路不好想。
#include <iostream>
#include <string>
#include <set>
#include <map>
#include<queue>
#include<stack>
#include<algorithm>
#include<cmath>
//new and delete
//A1103 Integer Factorization
using namespace std;
typedef int ElemType ;
vector <int> fac; //记录不超过N的n^P, dac[1]=1^P; fac[2]=2^P;
vector<int> ans, temp; //ans最优序列,temp临时序列
int ans_sum=-1; //ans的底数之和
int N, K, P;
/*
index: 当前处理的是fac[index];
nowK: 当前选择了几个数;
sum: 当前选择的总和
facsum: 当前选择的底数之和 " the maximum sum of the factors."*/
void DFS(int index, int nowK, int sum, int facsum) {
//cout << index << endl;
temp.push_back(index);
//如果nowK>K或者index<1或者sum>N
if (nowK > K || index<1 || sum>N) {
temp.pop_back();
return;
}
if (nowK == K && sum == N) {//符合条件的序列
if (facsum > ans_sum) {
ans_sum = facsum;
ans = temp;
}
temp.pop_back();
return;
}
//继续选index号数
DFS(index, nowK + 1, sum + fac[index], facsum + index);
//选index-1号数
DFS(index - 1, nowK + 1, sum + fac[index - 1], facsum + index - 1);
temp.pop_back();
return;
}
int main() {
/*fac.clear();
temp.clear();
ans.clear();
ans_sum = -1;*/
cin >> N >> K >> P;
//记录不超过N的n^P数组fac, fac[0]=0;fac[1]=1;
int i = 0;
while (1) {
int temp = pow(i, P);
if (temp > N)
break;
fac.push_back(temp);
i++;
}
for (i = fac.size(); i > 1; i--)
DFS(i - 1, 1, fac[i - 1], i - 1);
//无解
if (ans_sum == -1) {
cout << "Impossible\n";
}
else {
//有解
cout << N << " = ";
for (i = 0; i < ans.size(); i++) {
cout << ans[i] << "^"<<P;
if (i < ans.size() - 1)
cout << " + ";
}
cout << endl;
}
return 0;
}