【luogu/递归】烤鸡(多重循环转为尾递归)

问题描述:

题目描述

猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢?因为他有10种配料(芥末、孜然等),每种配料可以放1—3克,任意烤鸡的美味程度为所有配料质量之和

现在,Hanke想要知道,如果给你一个美味程度,请输出这10种配料的所有搭配方案

输入格式

一行,n<=5000

输出格式

第一行,方案总数

第二行至结束,10个数,表示每种配料所放的质量

按字典序排列。

如果没有符合要求的方法,就只要在第一行输出一个“0”

输入输出样例

输入 #1

11

输出 #1

10
1 1 1 1 1 1 1 1 1 2 
1 1 1 1 1 1 1 1 2 1 
1 1 1 1 1 1 1 2 1 1 
1 1 1 1 1 1 2 1 1 1 
1 1 1 1 1 2 1 1 1 1 
1 1 1 1 2 1 1 1 1 1 
1 1 1 2 1 1 1 1 1 1 
1 1 2 1 1 1 1 1 1 1 
1 2 1 1 1 1 1 1 1 1 
2 1 1 1 1 1 1 1 1 1 

说明/提示

枚举

基本思路:

乍一看10个for嵌套,真的只能这样吗?如果是100个,1000个循环呢?我拒绝!

不过我并没有想到元编程的一些解法,看了其它人的代码才知道:

那就是利用尾递归和循环能够相互转换的方法——将我们的多重循环转化为尾递归!然后在循环里面嵌套递归!

AC代码:

#include<bits/stdc++.h>
using namespace std;
// include<bits/stdc++.h>
// using namespace std 然后你就准备ambigous把

int a[15];
int result[10000][15];
int target = 0;
int count_ = 0;

void Turkey(int sum, int n) {
// n代表配料的编号
  if (n == 10) {
    if (sum == target) {
      for (int i = 0; i < 10; ++i) {
        result[count_][i] = a[i]; 
      }
      ++count_;
    }
    return;
  } 
  for (int i = 1; i <= 3; ++i) {
    a[n] = i;
    // cout << sum << endl;
    Turkey(sum + i, n + 1);   // 这里不需要修改sum,直接传表达式即可
  }
}

int main() {
  cin >> target;
  Turkey(0, 0);
  cout << count_ << endl;
  for (int i = 0; i < count_; ++i) {
    for (int j = 0; j < 10; ++j) {
      cout << result[i][j] << " ";
    }
    cout << endl;
  }
  return 0;
}

其它经验:

如其中的注释所言——#include<bits/stdc++.h> using namespace std; 然后你就等着编译器报ambigous的错误把!

发布了137 篇原创文章 · 获赞 19 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43338695/article/details/102878226