使用每种可能的组合创建序列

时间:2017-04-13 22:36:19

标签: c++ tail-recursion

我试图解决以下问题:对于给定的n和α,确定最小数k,其中n可以表示为k个数之和,每个数是一个完美的α次幂。

我的第一个想法是创建一个长度为n的序列,然后使用递归来创建具有完美α次幂的每个可能序列。在创建序列后,我将检查序列中所有数字的总和是否总和为n,然后检查数字的总数是否小于k,如果这些数字都为真,那么我将更新k。我写了一个解决大多数情况的程序,但由于某种原因没有创建所有可能的顺序。例如,如果用户输入92为n,3为α,则k应为3,因为4 ^ 3 + 3 ^ 3 + 1 ^ 3 = 92,但我的程序返回k = 92。

#include<iostream>
#include<cmath>

void check(const int &N, const int &A, int *pSeq, int position, int &K){
  int sum=0;
  int total=0;
  for(int i=0; i<N; ++i){
    sum+=pSeq[i];
    if(pSeq[i]>0){
      ++total;
    }
  }
  if(sum==N){
    if(total < k){
      K=total;
      std::cout<<"Print seq: ";
      for(int i =0; i<N; ++i){
        std::cout<<pSeq[i] <<" ";
      }
      std::cout<<std::endl;
    }
  }
  if(sum<N){
    if(position < N){
      for(int i=0; pow(i, A)<N+1; ++i){
        pSeq[position]=pow(i, A);
        check(N, A, pSeq, position+1, K);
      }
    }
  }
}

int main(){
  int n, a;
  std::cout<<"Enter n and a: ";
  std::cin>>n >>a;
  int k=n;
  int *sequence=new int[n];
  for(int i=0; i<n; ++i){
    sequence[i]=0;
  }

  check(n, a, sequence, 0, k);

  std::cout<<"k=" <<k <<std::endl;

  return 0;
}

1 个答案:

答案 0 :(得分:1)

好的,你没有任何反馈意见。让我们举个例子:循环使数组... 0 0 64 64然后它们去... 0 1 64 64等但是64 + 64 = 128&gt; 92.所以我们需要最后一个循环来降低功率并考虑...... 0 1 27 64,这就是答案。我添加了这些&#34;反馈&#34;你的代码。

#include<iostream>
#include<cmath>

int k = 99999;

void check(const int &N, const int &A, int *pSeq, int position, int &K,bool& too_big,bool& ready){
  if (ready)
    return;
  int sum=0;
  int total=0;
  for(int i=0; i<N; ++i){
    sum+=pSeq[i];
    if(pSeq[i]>0){
      ++total;
    }
  }
  if(sum==N){
    if(total < k){
      K=total;
      std::cout<<"Print seq: ";
      for(int i =0; i<N; ++i){
        std::cout<<pSeq[i] <<" ";
      }
      std::cout<<std::endl;
      ready = true;
      return;
    }
  }
  if(sum<N){
    if(position < N){
      for(int i=0; pow(i, A)<N+1; ++i){
        pSeq[position]=pow(i, A);
        check(N, A, pSeq, position+1, K,too_big,ready);
        if (too_big) {
          too_big = false;
          pSeq[position]=pow(i-1, A);
          return;
        }
      }
    }
  }
  else
    too_big = true;

}

int main(){
  int n, a;
  std::cout<<"Enter n and a: ";
  std::cin>>n >>a;
  int k=n;
  int *sequence=new int[n];
  for(int i=0; i<n; ++i){
    sequence[i]=0;
  }

  bool too_big = false,ready = false;
  check(n, a, sequence, 0, k,too_big,ready);

  std::cout<<"k=" <<k <<std::endl;

  return 0;
}

答案是

Print seq: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 27 64 
k=3