给定一个数组,求出这个数组中的数字能够组合出的最大的能被3整除的数字,每个数字最多使用一次。

 下面的代码没有测试数据,只自己进行了简单的测试。不一定保证正确。

#include 
#include 

using namespace std;

long long max_ans = -1e8;
void check(vector& path) {
    long long ans = 0;
    for (int i = 0; i < path.size(); i++) {
        ans = ans * 10 + path[i];
    }
    if (ans % 3 == 0) {
        max_ans = max(max_ans, ans);
    }
}

void recursive(vector& nums, vector path, int n, vector& vis, int depth) {
    // 这里depth很重要,必须由它给出一个递归返回的出口,不然就是死循环
    if (depth == n+1) return;
    if (path.size()) {
        check(path);
    }
    for (int i = 0 ; i < n; i++) {
        if (!vis[i]) {
            // 如果当前数没有选中,则选中
            vis[i] = 1;
            path.push_back(nums[i]);
            recursive(nums, path, n, vis, depth+1);
            path.pop_back();
            vis[i] = 0;
            // 当前数直接跳过,
            recursive(nums, path, n, vis, depth+1);
        }
    }
}
int main() {
    int n;
    while(true) {
        max_ans = -1e8;
        cin >> n;
        vector nums(n);
        for (int i = 0; i < n; i++) {
            int t;
            cin >> t;
            nums[i] = t;
        }
        for (int i = 0; i < nums.size(); i++) {
            vector path;
            path.push_back(nums[i]);
            vector vis(nums.size(), 0);
            vis[i] = 1;
            recursive(nums, path, nums.size(), vis, 1);
        }
        cout << max_ans << endl;

    }
    
    system("pause");
    return 0;
}

你可能感兴趣的:(算法,c++,数据结构)