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[难]
PAT 1103 Integer Factorization
1103. Integer Factorization (30)搜索+剪枝——PAT (Advanced Level) Practise