PAT甲级1103Integer Factorization

题目链接

https://pintia.cn/problem-sets/994805342720868352/problems/994805364711604224

题解

题目要求

  • 正整数N的K-P因数分解就是把N写成K个整数的P次幂之和。

  • 输入

    • N:不超过400,
    • K:不超过N
    • P:大于1,不超过7
  • 输出

    按格式输出K个整数

解题思路

DFS+剪枝

思路是按照柳神题解来的,我可真是个菜鸡┭┮﹏┭┮。

题目样例一的输出似乎是错的诶。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Problem: PAT Advanced 1103
// URL: https://pintia.cn/problem-sets/994805342720868352/problems/994805364711604224
// Tags: DFS 剪枝

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

int n, k, p, maxFacSum = -1;
vector<int> v, ans, tempAns;

void init() {
int temp = 0, index = 1;
while (temp <= n) {
v.push_back(temp);
temp = pow(index, p);
index++;
}
}

void dfs(int index, int tempSum,int tempK, int facSum){
if (tempK == k){
if (tempSum == n && facSum > maxFacSum){
ans = tempAns;
maxFacSum = facSum;
}
return;
}

while (index >= 1){
if (tempSum + v[index] <= n){
tempAns[tempK] = index;
dfs(index, tempSum + v[index], tempK + 1, facSum + index);
}
if (index == 1) return;
index--;
}
}

int main()
{
scanf("%d %d %d", &n, &k, &p);
init();
tempAns.resize(k);
dfs(v.size() - 1, 0, 0, 0);
if (maxFacSum == -1){
printf("Impossible");
return 0;
}
printf("%d = %d^%d", n, ans[0], p);
for(int i = 1; i < ans.size(); i++)
printf(" + %d^%d", ans[i], p);
return 0;
}

参考链接

https://blog.csdn.net/liuchuo/article/details/52493390


作者:@臭咸鱼

转载请注明出处:https://www.cnblogs.com/chouxianyu/

欢迎讨论和交流!