【PAT甲级】1103 Integer Factorization (30 分)
题意:
输入三个正整数N,K,P(N<=400,K<=N,2<=P<=7),降序输出由K个正整数的P次方和为N的等式,否则输出"Impossible"。
//找到最大可能的整数pos后从大到小爆搜,sample 1给的输出好像不是最大的序列。。。。。🤔
AAAAAccepted code:
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int a[407]; 5 int n,k,p; 6 int mxsum; 7 vector<int>ans,anss; 8 void solve(int now,int temp,int sum,int num){ 9 if(num==k&&temp==n&&sum>mxsum){ 10 anss=ans; 11 mxsum=sum; 12 } 13 if(num==k) 14 return ; 15 while(now>=1){ 16 if(temp+a[now]<=n){ 17 ans[num]=now; 18 solve(now,temp+a[now],sum+now,1+num); 19 } 20 if(now==1) 21 return ; 22 --now; 23 } 24 } 25 int main(){ 26 ios::sync_with_stdio(false); 27 cin.tie(NULL); 28 cout.tie(NULL); 29 cin>>n>>k>>p; 30 ans.resize(k); 31 int pos=0; 32 for(int i=1;i<=n+1;++i){ 33 a[i]=pow(i,p); 34 if(a[i]+k-1>n){ 35 pos=i; 36 break; 37 } 38 } 39 solve(pos-1,0,0,0); 40 if(!mxsum){ 41 cout<<"Impossible"; 42 return 0; 43 } 44 cout<<n<<" ="; 45 for(int i=0;i<anss.size();++i){ 46 cout<<" "<<anss[i]<<"^"<<p; 47 if(i<anss.size()-1) 48 cout<<" +"; 49 } 50 return 0; 51 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)