使用backtracking,一定要加入限制条件,否则测试点5会超时。
1.先把power为p的值计算好存放如数组中
2.设置两个栈,其中一个用于存放较大的sequence
3.从可能的最大factor开始dfs,这样就满足题目条件当sum相同时,输出大的sequence
4.计算最大值max,不超过n-k+1,并且调用dfs时传递max值,下一个factor的值从max开始计算
5.每次调用dfs时限制factor不小于n/k
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include <cstdio> int pow[21]; //存放 int n,k,p; struct{ int base[401]; int top; }S,T; //设置栈S,T,其中T存放结果 void push(int i){ S.base[S.top++]=i; } void pop(){ S.top--; } int ipow(int i,int p){ int k=1; for(int j=1;j<=p;j++) k*=i; return k; } int sum=0; void dfs(int n,int k,int p,int max){ if(n==0 && k==0){ int s=0; for(int i=0;i<S.top;i++) s+=S.base[i]; if(s>sum){ sum=s; T=S; } return; } /*--------以下限制条件,下个factor不可能超过max-------*/ while(pow[max]>n-k+1) max--; for(;pow[max]>=n/k;max--){ push(max); dfs(n-pow[max],k-1,p,max); pop(); } } int main(){ S.top=0; scanf("%d%d%d",&n,&k,&p); int max; for(max=1,pow[1]=1;pow[max]<=n-k+1;max++) pow[max+1]=ipow(max+1,p); dfs(n,k,p,--max); if(sum){ printf("%d = %d^%d",n,T.base[0],p); for(int i=1;i<T.top;i++) printf(" + %d^%d",T.base[i],p); } else printf("Impossible"); return 0; } |
测试点
测试点 | 结果 | 用时(ms) | 内存(kB) | 得分/满分 |
---|---|---|---|---|
0 | 答案正确 | 1 | 188 | 15/15 |
1 | 答案正确 | 1 | 180 | 2/2 |
2 | 答案正确 | 1 | 308 | 5/5 |
3 | 答案正确 | 1 | 304 | 1/1 |
4 | 答案正确 | 1 | 192 | 1/1 |
5 | 答案正确 | 64 | 256 | 3/3 |
6 | 答案正确 | 1 | 256 | 2/2 |
7 | 答案正确 | 1 | 304 | 1/1 |