计算机二级C语言辅导:回溯法之数的划分

来源:计算机等级考试    发布时间:2012-08-28    计算机等级考试视频    评论

  #include <iostream>
  #include <vector>
  using namespace std;
  long long r[221][11][221];
  int f(int m, int n, int c)
  {
  //只要分成两列,在首位数字确定的情况下只可能有一种分法
  if( n <= 2 )
  return 1;
  int i;来源:考的美女编辑们
  int result = 0;
  int max = (m - c) / (n - 1);//首位数字最大值
  int tmp = 0;
  for(i = c; i <= max; i++)
  {
  if( r[m - c][n - 1][i] == 0 )
  {
  r[m - c][n - 1][i] = f(m - c, n - 1, i);
  }
  result += r[m - c][n - 1][i];
  }
  r[m][n][c] = result;
  return result;
  }
  vector<int> Record(int m, int n, int k)
  {
  vector<int> s;
  int i;
  for( i = 1; i <= m / n; i++)
  {
  f(m, n, i);//按需调用考试大论坛
  if(r[m][n][i] < k)
  {
  k -= r[m][n][i];//如果当前的次序不够k, 把k减少,相当于从i + 1 后找第k'名
  }
  else
  {
  s.push_back(i);//存储路径本文来源:考试大网
  if( n == 2 )
  {
  s.push_back(m - i);//列数为2的时候,存储两列,退出
  break;
  }
  else
  {
  m -= i;//修改m为首位后面的数字和
  --n;//行数减少了1
  --i;//为了保持i不变,这里减少了1
  }
  }来源:考的美女编辑们
  }
  return s;
  }
  void Output(vector<int> seq)
  {
  int size = seq.size();
  if(size > 0 )
  {
  cout << seq[0] ;
  for(int i = 1; i < size; i++)
  cout << ' ' << seq[i];
  cout << endl;
  }
  }
  int main()
  {
  int m, n, k;
  while( cin >> m >> n >> k )
  {
  Output(Record(m, n, k));
  }
  return 0;
  }

  计算机二级C语言程序设计实战

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答