#include <iostream> #include <cstring> using namespace std; int a[10], b[10]; int ans[10]; // 定义不同套餐中A-I每种物品出现的次数 int pack[10][9] = { {1, 1, 0, 1, 0, 0, 0, 0, 0}, {1, 1, 1, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 1, 1, 0, 0, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 1, 1, 1, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0, 1}, {0, 1, 0, 0, 1, 0, 1, 1, 0}, {0, 0, 0, 0, 0, 1, 0, 1, 1}, {0, 0, 1, 0, 1, 0, 1, 0, 1}, }; bool dfs(int k) { if (k == 10) { for (int i = 0; i < 9; i++) { if ((a[i] + ans[i]) % 4 != 0) { return false; } } return true; } for (int i = 0; i <= b[k]; i++) { // 套餐包含A-I每种物品的数量 int p[9]; memcpy(p, pack[k], sizeof(p)); for (int j = 0; j < 9; j++) { a[j] += p[j] * i; } // 更新套餐的数量 ans[k] = i; // 继续搜索下一个套餐 if (dfs(k + 1)) { return true; } // 回溯 for (int j = 0; j < 9; j++) { a[j] -= p[j] * i; } ans[k] = 0; } return false; } int main() { memset(a, 0, sizeof(a)); for (int i = 0; i < 9; i++) { cin >> b[i]; b[i] %= 4; } dfs(1); // 输出答案 for (int i = 1; i <= 9; i++) { for (int j = 0; j < ans[i]; j++) { cout << i << " "; } } cout << endl; return 0; } |
Double click to view unformatted code.