鱼C论坛

 找回密码
 立即注册
查看: 1893|回复: 0

[技术交流] PTA A_1103 Integer Factorization

[复制链接]
发表于 2020-2-7 11:34:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 798236606 于 2020-2-7 11:34 编辑

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

解:
1.深度优先遍历
  1. #include<cstdio>
  2. #include<vector>
  3. #include<cmath>

  4. using namespace std;

  5. int n, k, p, maxsum = -1;
  6. vector <int> temp, ans;

  7. void DFS(int fac, int now, int sum)
  8. {
  9.     if (now == n && temp.size() == k)
  10.     {
  11.         if (sum > maxsum)
  12.         {
  13.             maxsum = sum;
  14.             ans = temp;   
  15.         }
  16.             
  17.         return;
  18.     }   
  19.    
  20.     int num = now + (int)pow((double)fac, (double)p);

  21.     if (num <= n && temp.size() < k)
  22.     {   
  23.         temp.push_back(fac);
  24.         DFS(fac, num, sum + fac);
  25.         temp.pop_back();
  26.     }
  27.         
  28.     if (fac > 1)
  29.         DFS(fac - 1, now, sum);
  30. }

  31. int main(void)
  32. {
  33.     scanf("%d %d %d", &n, &k, &p);
  34.    
  35.     DFS(20, 0, 0);//观察到n<=400且p >=2, 则最大的因数为20。

  36.     if (ans.size())
  37.     {
  38.         printf("%d = ", n);
  39.         for (int i = 0; i < ans.size(); i++)
  40.         {
  41.             printf("%d^%d", ans[i], p);
  42.             
  43.             if (i < ans.size() - 1)
  44.                 printf(" + ");
  45.         }        
  46.     }
  47.     else
  48.         puts("Impossible");
  49.       
  50.     return 0;   
  51. }
复制代码

2.深度优先遍历 + 因数优化
  1. #include<cstdio>
  2. #include<vector>
  3. #include<cmath>

  4. using namespace std;

  5. int n, k, p, maxsum = -1;
  6. vector <int> temp, ans, fac;

  7. void DFS(int index, int now, int sum)
  8. {
  9.     if (now == n && temp.size() == k)
  10.     {
  11.         if (sum > maxsum)
  12.         {
  13.             maxsum = sum;
  14.             ans = temp;   
  15.         }
  16.             
  17.         return;
  18.     }   
  19.    
  20.     int num = now + fac[index];

  21.     if (num <= n && temp.size() < k)
  22.     {   
  23.         temp.push_back(index);
  24.         DFS(index, num, sum + index);
  25.         temp.pop_back();
  26.     }
  27.         
  28.     if (index > 1)
  29.         DFS(index - 1, now, sum);
  30. }

  31. int main(void)
  32. {
  33.     scanf("%d %d %d", &n, &k, &p);
  34.    
  35.     for(int i = 0; (int)pow((double)i, (double)p) <= n; i++)//直接算出所有可能的因数,存储在fac数组        
  36.         fac.push_back((int)pow((double)i, (double)p));
  37.    
  38.     DFS(fac.size() - 1, 0, 0);

  39.     if (ans.size())
  40.     {
  41.         printf("%d = ", n);
  42.         for (int i = 0; i < ans.size(); i++)
  43.         {
  44.             printf("%d^%d", ans[i], p);
  45.             
  46.             if (i < ans.size() - 1)
  47.                 printf(" + ");
  48.         }        
  49.     }
  50.     else
  51.         puts("Impossible");
  52.       
  53.     return 0;   
  54. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-6 22:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表