原题:1103. Integer Factorization (30)
解题思路:
dfs从大数往小数暴力递归即可。
代码如下:
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int n, k, p, maxSum;
vector<int> ans, temp, fac;
int power(int a, int n)
{
int ans = 1;
for(int i = 0; i < n; i++)
ans = ans * a;
return ans;
}
void init()
{
int i = 0, temp = 0;
while(temp <= n)
{
fac.push_back(temp);
i++;
temp = power(i, p);
}
}
void dfs(int index, int nowK, int nowPsum, int nowSum)
{
if(nowK == k && nowPsum == n) //满足条件与之前的比较
{
if(nowSum > maxSum)
{
maxSum = nowSum;
ans = temp;
}
return ;
}
if(nowK > k || nowPsum > n) return ;
if(index - 1 >= 0)
{
temp.push_back(index);
dfs(index, nowK+1, nowPsum + fac[index], nowSum + index); //选这个数
temp.pop_back();
dfs(index - 1, nowK, nowPsum, nowSum); //不选这个数
}
}
int main()
{
while(scanf("%d%d%d", &n, &k, &p) == 3)
{
ans.clear();
temp.clear();
init();
maxSum = -1;
dfs(fac.size()-1, 0, 0, 0);
if(maxSum == -1) printf("Impossible\n");
else
{
printf("%d =", n);
for(int i = 0; i < ans.size(); i++)
{
if(i == 0)
printf(" %d^%d", ans[i], p);
else
printf(" + %d^%d", ans[i], p);
}
printf("\n");
}
}
return 0;
}