算法学习——子集/组合型回溯如何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]++;
}
}
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通