算法学习——子集/组合型回溯如何debug

var code = "b1ddb6f7-fbaf-4072-87e4-e772b7a1642e"

leetcode 2397

class Solution {
public:
    int n,m,nums1[20],res;
    vector<int>tmp;
    int maximumRows(vector<vector<int>>& a, int cnt) {
        n = a.size();
        m = a[0].size();
        for(int i=0;i<n;i++) {
            for(int j=0;j<m;j++) {
                if(a[i][j] == 1) nums1[i]++;
            }
            // cout<<nums1[i]<<endl;
        }
        dfs(0,cnt,a);
        return res;
    }
    void dfs(int start,int cnt,vector<vector<int>>& a) {
        if(cnt == 0) {
            int t=0;
            for(int i=0;i<n;i++) {
                if(!nums1[i]) t++;
                // cout<<" i "<<i<<" "<<nums1[i]<<endl;
            }
            // cout<<"chose ";
            // for(int i=0;i<tmp.size();i++) cout<<tmp[i]<<" ";
            // cout<<endl;
            // cout<<"t "<<t<<endl;
            // cout<<endl;
            res = max(res,t);
            return;
        }
        if(start>=m) {
            // cout<<"test"<<endl;
            return;
        }
        if(cnt>m-start) return;
        
        for(int j=start;j<m;j++) {
            for(int i=0;i<n;i++) {
                if(a[i][j] == 1) nums1[i]--;
            }
            tmp.push_back(j);           /////////////////////////////////////// 可以创建一个vector<int>tmp 在这个位置入栈,出来的时候出栈,回溯的时候输出出来,就可以得到这一次枚举的组合是什么;如果是子集问题则其实每次进入节点的时候都是一个子集,直接输出就行,注意美观度
            //  cout<<"ccnt j "<<j<<" "<<nums1[j]<<" cnt "<<cnt;
            dfs(j+1,cnt-1,a); ////////////////////////////////////////// 特别要强调递归从j开始,从start开始是错误的!!!!

            tmp.pop_back();
            for(int i=0;i<n;i++) {
                if(a[i][j] == 1) nums1[i]++;
            }
        }
    }
};
posted @   lovevivi121  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示