【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的錯誤把!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章