算法学习——子集/组合型回溯如何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]++;
}
}
}
};

浙公网安备 33010602011771号