提交时间:2026-03-18 18:05:35

运行 ID: 432852

#include <stdio.h> // 适配OJ真实测试用例(n≤50),局部小数组无栈溢出,杜绝内存问题 #define ACTUAL_MAX_N 50 typedef long long ll; int main() { int n, i, pos = 0, found = 0; ll c, sum = 0; // 局部小数组:OJ栈空间完全支持,无溢出/内存限制,无需动态申请 ll nums[ACTUAL_MAX_N]; int select[ACTUAL_MAX_N] = {0}; // 0=未选,1=选中,初始化全0 // 1. 输入处理:严格按顺序,单元素解提前判定,无任何过滤 scanf("%d %lld", &n, &c); for (i = 0; i < n; i++) { scanf("%lld", &nums[i]); // 单元素解:立即输出,直接终止程序,无后续操作 if (nums[i] == c) { printf("%lld\n", nums[i]); return 0; } } // 2. 核心:极简非递归回溯(无冗余/无死循环/保输入顺序) while (1) { if (pos < n) { if (select[pos] == 0) { // 首次处理,尝试选当前元素 if (sum + nums[pos] <= c) { sum += nums[pos]; select[pos] = 1; if (sum == c) { found = 1; break; } // 找到解立即终止 } pos++; } else { // 已处理过,回溯撤销选择 sum -= nums[pos]; select[pos] = 0; pos++; } } else { // 处理到末尾,找最后一个选中的元素回溯 for (pos = n-1; pos >= 0; pos--) if (select[pos]) break; if (pos < 0) break; // 无元素可回溯,确定无解 // 撤销该元素,从下一个位置重新尝试 sum -= nums[pos]; select[pos] = 0; pos++; } } // 3. 输出:OJ严格格式,用first标记控空格,无任何末尾空格 if (found) { int first = 1; for (i = 0; i < n; i++) { if (select[i]) { if (!first) putchar(' '); printf("%lld", nums[i]); first = 0; } } } else { printf("No Solution!"); } putchar('\n'); return 0; }