PAT甲级A1103----深度优先搜索

1103 Integer Factorization (30分)

1103
分析:

将N表示成K个正整数的P次方之和,如果有多种方案,则输出底数之和最大的那种方案,且必须按照底数从大到小的顺序输出。

C++:
#include 
#include 
#include 

using namespace std;

int n, k, p;
int maxFacSum = -1;
vector fac, res, temp;

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

void dfs(int index, int nowK, int sum, int facSum) {
    if (sum == n && nowK == k) {
        if (facSum > maxFacSum) {
            res = temp;
            maxFacSum = facSum;
        }
        return;
    }
    if (sum > n || nowK > k) {
        return;
    }
    if (index - 1 >= 0) {
        temp.push_back(index);
        dfs(index, nowK + 1, sum + fac[index], facSum + index);
        temp.pop_back();
        dfs(index - 1, nowK, sum, facSum);
    }

}

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

你可能感兴趣的:(PAT甲级A1103----深度优先搜索)