【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 }

 

posted @ 2019-12-04 08:26  sewage  阅读(167)  评论(0编辑  收藏  举报