您的位置:首页 > 其它

Integer Factorization (30)解题报告

2016-12-30 16:19 260 查看
利用DFS对状态空间进行搜索,注意进行剪枝,否则会超时。

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
using namespace std;

int power(int num, int p);
void dfs(int num, int k, int p);

vector<int> v;
int upper;
int main(void)
{
int n, k, p, i;
scanf("%d %d %d", &n, &k, &p);
for (i = 1; i <= n; i++) {
if (power(i, p) >= n) {
upper = i;
break;
}
}
dfs(n, k, p);
if (v.size()) {
printf("%d = %d^%d", n, v[0], p);
for (i = 1; i < v.size(); i++) {
printf(" + %d^%d", v[i], p);
}
putchar('\n');
}
else {
puts("Impossible");
}
return 0;
}

int power(int num, int p)
{
int i, sum = 1;
for (i = 0; i < p; i++) {
sum *= num;
}
return sum;
}

void dfs(int num, int k, int p)
{
static vector<int> tmp;
static int vsum = 0;
if (!k && !num) {
int sum = 0;
if (!v.size()) {
for (auto &i : tmp) {
sum += i;
}
vsum = sum;
v = tmp;
}
else {
for (auto &i : tmp) {
sum += i;
}
if (sum > vsum) {
v = tmp;
vsum = sum;
}
else if (sum == vsum && tmp > v) {
v = tmp;
}
}
}
else if (num > 0 && k > 0) {
int i, j;
for (i = tmp.size() ? tmp[tmp.size() - 1] : upper; i >= 1; i--) {
j = power(i, p);
if (j * k < num) {
break;
}
else if (j <= num) {
tmp.push_back(i);
dfs(num - j, k - 1, p);
tmp.pop_back();
}
}
}
return;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: