問題描述:
題目描述
豬豬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的錯誤把!