鱼C论坛

 找回密码
 立即注册
查看: 1590|回复: 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.深度优先遍历
#include<cstdio>
#include<vector>
#include<cmath>

using namespace std;

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

void DFS(int fac, int now, int sum)
{
    if (now == n && temp.size() == k)
    {
        if (sum > maxsum)
        {
            maxsum = sum;
            ans = temp;    
        }
            
        return;
    }    
    
    int num = now + (int)pow((double)fac, (double)p);

    if (num <= n && temp.size() < k)
    {    
        temp.push_back(fac);
        DFS(fac, num, sum + fac);
        temp.pop_back();
    }
        
    if (fac > 1)
        DFS(fac - 1, now, sum);
}

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

    if (ans.size())
    {
        printf("%d = ", n);
        for (int i = 0; i < ans.size(); i++)
        {
            printf("%d^%d", ans[i], p);
            
            if (i < ans.size() - 1)
                printf(" + ");
        }        
    }
    else
        puts("Impossible");
      
    return 0;    
}
2.深度优先遍历 + 因数优化
#include<cstdio>
#include<vector>
#include<cmath>

using namespace std;

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

void DFS(int index, int now, int sum)
{
    if (now == n && temp.size() == k)
    {
        if (sum > maxsum)
        {
            maxsum = sum;
            ans = temp;    
        }
            
        return;
    }    
    
    int num = now + fac[index];

    if (num <= n && temp.size() < k)
    {    
        temp.push_back(index);
        DFS(index, num, sum + index);
        temp.pop_back();
    }
        
    if (index > 1)
        DFS(index - 1, now, sum);
}

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

    if (ans.size())
    {
        printf("%d = ", n);
        for (int i = 0; i < ans.size(); i++)
        {
            printf("%d^%d", ans[i], p);
            
            if (i < ans.size() - 1)
                printf(" + ");
        }        
    }
    else
        puts("Impossible");
      
    return 0;    
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 03:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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