1. 程式人生 > >1103 Integer Factorization

1103 Integer Factorization

clu 序列 flow i++ integer csu n) emp lib

題意:給出一個正整數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; }

1103 Integer Factorization