题意:给出一个正整数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==0 || 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; }