给定一个数n如23121;给定一组数字a如[2 4 9]求由a中元素组成的小于n的最大数。解法思路就是暴力递归,目前还没找到bad case,欢迎测试。
#include
#include
#include
#include
using namespace std;
const int N = 10010;
// 小于n 的最大数
vector<int> a;
int n, ans, target;
bool flag;
void dfs(int idx, int len, int cur, int last) {
if (idx == len) {
if (cur < target && cur != 0) {
ans = max(ans, cur);
}
return;
}
for (int i = 0; i <= n; i++) {
if (i == 0) {
if(last == 0 && !flag) dfs(idx + 1, len, cur * 10 + a[i], a[i]);
else continue;
}
else {
flag = true;
dfs(idx + 1, len, cur * 10 + a[i], a[i]);
flag = false;
}
}
}
void stdInputs() {
ans = -1;
cin >> n;
flag = false;
a.resize(n+1, 0);
for (int i = 1; i <= n; i++) cin >> a[i];
cin >> target;
int len = to_string(target).length();
dfs(0, len, 0, 0);
cout << ans;
}
void caseTest(vector<int> tmp, int x) {
ans = -1;
flag = false;
target = x;
n = tmp.size();
tmp.insert(tmp.begin(), 0); // 为了处理0开头的情况
a = tmp;
dfs(0, to_string(target).length(), 0, 0);
cout << "test case: ";
for (int i = 1; i < a.size(); i++) cout << a[i] << " ";
cout << " and x = " << target << ". The ans is: " << ans << endl;
}
int main() {
caseTest({1, 2, 4, 9}, 2533); // 2499
caseTest({ 1, 2, 4, 9 }, 2409); // 2299
caseTest({ 1, 2, 4, 9 }, 1111); // 999
caseTest({ 1, 2, 4, 9 }, 3000); // 2999
caseTest({ 1, 2, 4, 9 }, 2100); // 1999
caseTest({ 1, 2, 4, 9 }, 1249); // 1244
caseTest({ 1, 2, 4, 9 }, 4921); // 4919
caseTest({ 1, 2, 4, 9 }, 1); // -1
caseTest({ 1, 2, 3 }, 101);
caseTest({ 1, 2, 9 }, 1201); // 1121
caseTest({ 1, 4, 9 }, 24132);
caseTest({ 1, 4, 9 }, 14132);
caseTest({ 2, 4, 5 }, 24131);
caseTest({ 2, 4, 9 }, 23132); // 22999
caseTest({ 2, 4, 9 }, 21132); // 9999
caseTest({ 2, 4, 9 }, 24132); // 19999
caseTest({ 2, 4, 9 }, 14132); // 14119
caseTest({ 2, 3, 5 }, 3211);
caseTest({ 6, 7, 8 }, 1200);
caseTest({ 6, 9 }, 95); // 69
return 0;
}