1103 Integer Factorization (30point(s)) 需要二刷 *存在DFS深度遍历爆栈和TLE问题
基本思想:
就是树形DFS遍历,没啥新意;
关键点:
最主要的是出现了一个问题,如果用for循环,在相同的剪枝条件和递归边界下,会遇到TLE和爆栈得风险;
后来和k神讨论,发现是for循环强行每次迭代枚举,多了很多不可能得情况;
例如如果第一位是6,后续每轮从6~0枚举,但是如果第一位变成5的话,后续还是从6~0枚举,所以会出现冗余情况,所以才会爆栈;
所以dfs还是要注意参数传递问题,递归边界也要设置一下;
#include<iostream> #include<stdlib.h> #include<stdio.h> #include<vector> #include<string> #include<math.h> #include<algorithm> #include<cstring> #include<map> #include<queue> #include<set> #include<stack> using namespace std; int n, k, p; vector<vector<int>> res; vector<int>r; vector<int>ini; int sq; int max_num = 0; bool cmp1(vector<int> a, vector<int> b) { string s1, s2; for (int i = 0; i < a.size(); i++) { s1 += a[i] + '0'; s2 += b[i] + '0'; } return s1 > s2; } void init() { //提前进行打表初始化 ini.resize(sq+1); for (int i = 0; i <= sq; i++) { ini[i] = int(pow(i, p)); } } void dfs(int index,int cnt, int cy,int sum) { if (cy == 0) { //如果到头了; if (cnt == n) { if (sum > max_num) { res.resize(0); res.push_back(r); max_num = sum; } else if (sum == max_num) { res.push_back(r); } } return; } while (index >= 0) { if (cnt + ini[index] <= n) { r.push_back(index); dfs(index, cnt + ini[index], cy - 1, sum + index); r.pop_back(); } if (index == 1) return; index--; } //for (int i = ini.size()-1; i >0; i--) { // if (cnt + ini[i] <= n) { // r.push_back(i); // dfs(cnt + ini[i], cy - 1,sum+i); // r.pop_back(); // //cout << i << endl; // } //} } int main() { cin >> n >> k >> p; sq = sqrt(n); init(); dfs( sq,0, k,0); if (res.size() == 0) { cout << "Impossible" << endl; return 0; } sort(res.begin(), res.end(), cmp1); printf("%d = ",n); for (int i = 0; i < k; i++) { if (i == 0) printf("%d^%d", res[0][i], p); else printf(" + %d^%d", res[0][i], p); } return 0; }

浙公网安备 33010602011771号