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\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/kkmjy/p/9594277.html
今日推荐