1103 Integer Factorization

Posted kkmjy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1103 Integer Factorization相关的知识,希望对你有一定的参考价值。

题意:给出一个正整数N,以及k,p,要求把N分解成k个因式,即N=n1^p + n2^p + ... + nk^p。要求n1,n2,...按降序排列,若有多个解,则选择n1+n2+...+nk最大的,若还有多个解,则选择数字序列较大的。若不存在解,则输出Impossible.

思路:【这是道好题!】这是深度优先搜索的经典例题。分析暂时略。

代码:

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

const int maxn=405;
int factor[maxn];
int len=0;
int n,k,p;

void init()
{
    int temp=0;
    while(temp<=n) {
        factor[len++]=temp;
        temp=pow(len,p);
    }
}

int maxFacSum=0;
vector<int> ans,tmp;
bool flag=false;
void dfs(int idx,int currK,int currN,int currFacSum)
{
    if(currK==k && currN==n){
        flag=true;
        if(currFacSum>maxFacSum){
            maxFacSum=currFacSum;
            ans=tmp;
        }
        return;
    }
    if(idx<1 || currK>k || currN>n) return;//第一个条件不能漏!
    tmp.push_back(idx);
    dfs(idx,currK+1,currN+factor[idx],currFacSum+idx);
    tmp.pop_back();
    dfs(idx-1,currK,currN,currFacSum);
}

int main()
{
    scanf("%d%d%d",&n,&k,&p);
    init();//预处理
    dfs(len-1,0,0,0);
    if(flag){
        printf("%d = %d^%d",n,ans[0],p);
        for(int i=1;i<ans.size();i++)
            printf(" + %d^%d",ans[i],p);
    }else{
        printf("Impossible
");
    }
    return 0;
}

 

以上是关于1103 Integer Factorization的主要内容,如果未能解决你的问题,请参考以下文章

PAT甲级1103 Integer Factorization (30分)

PAT 1103 Integer Factorization[难]

1103 Integer Factorization

PAT 1103 Integer Factorization

1103. Integer Factorization (30)搜索+剪枝——PAT (Advanced Level) Practise

1103 Integer Factorization