問題の説明:
タイトル説明
豚ハンケ特にローストチキンを食べるのが好き(これは同じ獣はfratricidal、です!)ハンケ鶏は非常に特別である。なぜ特別な?彼は10の成分(などマスタード、クミンなど)を持っているので、あなたはどんな食材の品質の、すべてのために、各成分1-3グラム、おいしい鶏の範囲を置くことができます
プログラムと今、ハンケが知りたい、あなたはおいしい度を与えている場合、してください出力これらすべての10の成分
入力形式
行、N <= 5000
出力フォーマット
最初の行、プログラムの総数
2行目の末尾に、数10は、各成分の品質の放出を示し
辞書式順序によります。
出力の1行目に限り、「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で、できるだけで本当にそう?それは100、1000サイクルことですか?Iゴミ!
しかし、私が知っている他の人のコードを読んで、メタプログラミングソリューションを考えていませんでした。
つまり、末尾再帰ループの方法を使用して、相互に変換することができます-私たちの複数のループは、末尾再帰に!そして、再帰的ループ内にネスト!
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;
}
その他の経験:
コメントの一つとして言った - #は、名前空間stdを使用して、あなたは、コンパイラのエラーレポート不明瞭プットを待つ<++ビット/ STDC時間。>!