1103. Integer Factorization (30)

使用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值