贴一个回溯 + 剪枝 实际时间复杂度应该很低 每一位数最多两种可能O(2^9) 欢迎大佬指正 #include<bits> using namespace std; typedef long long LL; typedef pair<int> PII; int solve(vector<int> nums, int n){ sort(nums.begin(), nums.end()); nums.erase(unique(nums.begin(), nums.end()), nums.end()); int m = nums.size(); int res = 0; string target = to_string(n); int len = target.size(); function<bool> dfs = [&](int x){ if(x == len && res < n){ if(res == 0) return false; return true; } for(int i = m - 1; i >= 0; i --){ if(res + nums[i] * (int) pow(10, len - x - 1) >= n) continue; res += nums[i] * (int)pow(10, len - x - 1); // cout << res << "\n"; if(dfs(x + 1)) return true; res -= nums[i] * (int)pow(10, len - x - 1); } if(x == 0){ res = 0; if(dfs(x + 1)) return true; } return false; }; if(dfs(0)) return res; return -1; } int main() { vector<int> nums = {6, 9, 3, 5}; cout << solve(nums, 56449) << "\n"; } </int></bool></int></int></bits>