回溯法 解 1363 形成三的最大倍数

Posted 小师叔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回溯法 解 1363 形成三的最大倍数相关的知识,希望对你有一定的参考价值。

简介

虽然超时了, 但是我还是想把这种思想放在这里. 这肯定可以做(现在是回溯增加), 改为回溯减少一定就可以了.

code

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
    void dfs(vector<int> &candidates, vector<int> &ans, vector<int> &combine, int idx) {
        if(idx >= candidates.size()) {
            return;
        }
        // 直接跳过
        dfs(candidates, ans, combine, idx + 1);

        
        // 选择当前数
        combine.emplace_back(candidates[idx]);
                vector<int> tmp;
        tmp.assign(combine.begin(), combine.end());
        sort(tmp.begin(), tmp.end(), greater<int>());
        int sumAdd = 0;
        for(auto it: tmp){
            sumAdd += it;
        }
        
        if(sumAdd % 3 == 0) {
            string s1;
            for(auto it : tmp){
                s1 += it + \'0\';
            }
            string s2;
            for(auto it : ans){
                s2 += it + \'0\';
            }
            if(s1.size() > s2.size()){
                ans.clear();
                ans.assign(tmp.begin(), tmp.end());
            }else if(s1.size() == s2.size()){
                if(s1 > s2) {
                    ans.clear();
                    ans.assign(tmp.begin(), tmp.end());
                }
            }
        }
        dfs(candidates, ans, combine, idx+1);
        combine.pop_back();
        //cout << idx ;
    }
    string largestMultipleOfThree(vector<int>& digits) {
        vector<int> ans;
        vector<int> combine;
        dfs(digits, ans, combine, 0);
        string s2;

        for(auto it : ans){
            s2 += it + \'0\';
        }
        if(ans.size() > 0  && ans[0] == 0){
            return "0";
        }
        return s2;
    }
};
int main() {
    Solution s;
    int a [] = {0,0,0,0,0,0};
    vector<int> t;
    t.assign(a, a+6);
    cout << s.largestMultipleOfThree(t);
    // string c = "123";
    // string d = "43";
    // if(c > d){
    //     cout << c;
    // }
    return 0;
}

以上是关于回溯法 解 1363 形成三的最大倍数的主要内容,如果未能解决你的问题,请参考以下文章

python+输出100以内三的倍数的和?

0-1背包问题的回溯法代码

算法设计与分析——回溯法算法模板

分治算法解最大子序列和问题

2021/6/19 刷题笔记串联字符串的最大长度与回溯法

回溯法