#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; string s[7] = {"", "", "", "", "", "", ""}; /* 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 = 7; n <= 38; n++) { // 最小值 mi = LONG_LONG_MAX; // 开启第一轮次,目前拼接出的数字为0,并且还剩18根木棍 dfs(1, 0, n); // 如果没有找到答案,输出-1 if (mi == LONG_LONG_MAX) { cout << "n=" << n << ",ans=" << -1 << endl; } else { int q = n % 7; string str = "n=" + to_string(n) + ",ans=" + to_string(mi); if (s[q] == "") { s[q] = str; } else { s[q] = s[q] + "," + str; } } } for (int i = 0; i < 7; i++) { cout << " " << s[i] << endl; } return 0; }