题目
蒜头君是洋葱王国的首席科学家,他有一个仪器可以用任意原子合成新的分子。现在一共有 101010 种可供选择的原子,每种原子必须使用 111、222、333 个,总的原子个数规定是 nnn。蒜头君想请你帮忙计算,一共能合成多少个不同的分子(不考虑同分异构体)?
输入格式
一个整数 n (1≤n≤50)n\ (1 \le n \le 50)n (1≤n≤50),表示新分子的原子总个数。
输出格式
第一行一个整数 mmm,表示不同的方案数。
接下来 mmm 行,每行为一种方案,包含 101010 个整数,表示每种原子的个数。
方案按字典序从小到大输出。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
29
样例输出
10
2 3 3 3 3 3 3 3 3 3
3 2 3 3 3 3 3 3 3 3
3 3 2 3 3 3 3 3 3 3
3 3 3 2 3 3 3 3 3 3
3 3 3 3 2 3 3 3 3 3
3 3 3 3 3 2 3 3 3 3
3 3 3 3 3 3 2 3 3 3
3 3 3 3 3 3 3 2 3 3
3 3 3 3 3 3 3 3 2 3
3 3 3 3 3 3 3 3 3 2
思路
参数记录每一个原子的个数,另一个参数记录总的原子数,如果记录数据和总的原子数相等,就记录到res
值得注意的是处理小于10的数据,结果就是没有方案
题解
#include <iostream>
#include <vector>
#define atomType 10
using namespace std;
int atomNum, ans;
vector<vector<int> > res;
void dfs(int index, int count, vector<int> track) {
// 剪枝和边界问题
if (3*(atomType-index) < atomNum - count || index > 10) return;
// base case
if (count == atomNum && index == 10) {
ans++;
res.push_back(track);
return;
}
// 基本dfs
for (int i=1; i<=3; i++){
track.push_back(i);
dfs(index+1, count+i, track);
track.pop_back();
}
}
int main() {
cin >> atomNum;
vector<int> track;
dfs(0, 0, track);
// 输出数据
cout << ans << endl;
for (int i=0; i<res.size(); i++) {
for (int j=0; j<res[0].size(); j++) {
cout << res[i][j] <<" ";
}
cout << endl;
}
return 0;
}
谢谢大家的支持!,有问题评论区问我ou!