#include using namespace std; typedef long long LL; // 声明一个结构体存储每个数字的木棍数 struct Node { int num; int cnt; } a[6] = {{0, 6}, {1, 2}, {2, 5}, {4, 4}, {7, 3}, {8, 7}}; LL mi = LONG_LONG_MAX; /* u: 第几个数字 sum: 拼接出的数字 r: 剩余木棍数 */ void dfs(int u, LL sum, int r) { // 递归出口 if (r == 0) { // 如果剩余木棍数是0,说明拼接出了一个数字,输出即可 mi = min(mi, sum); return; } // 遍历每个可能的数字,如果剩余木棍数够用,就选择这个数字 for (int i = 0; i < 6; i++) { if (a[i].cnt <= r) { // 如果剩余木棍数够用,就选择这个数字 // 如果当前数字是6,并且是前导零,就选择6,否则选择0 int cur = (a[i].num == 0 && u == 1) ? 6 : a[i].num; // 递归调用,拼接出下一个数字 dfs(u + 1, sum * 10 + cur, r - a[i].cnt); } } } int main() { for (int n = 1; n <= 35; n++) { // 最小值 mi = LONG_LONG_MAX; // 开启第一轮次,目前拼接出的数字为0,并且还剩18根木棍 dfs(1, 0, n); // 如果没有找到答案,输出-1 if (mi == LONG_LONG_MAX) cout << "n=" << n << ",ans=" << -1 << endl; else cout << "n=" << n << ",ans=" << mi << endl; } return 0; }