生成一组所有组合

时间:2021-07-27 17:49:14

标签: c++ algorithm permutation

我正在尝试解决a problem

<块引用>

有一个由 n 个问题组成的调查,其中每个问题的答案是 0(否)或 1(是)。学生的答案由一个二维整数数组students 表示,其中student[i] 是一个整数数组,其中包含第i 个学生(0 索引)的答案(对于导师也是如此)。
每个学生将分配给一名导师,每个导师将分配一名学生。 学生-导师对的兼容性分数是学生和导师答案相同的数量。
例如:如果 students = [[1,1,0],[1,0,1],[0,0,1]], mentors = [[1,0,0],[0,0,1],[1,1,0]] 那么输出应该是 8。 (学生 0 与导师 2 配对(得分 3)、学生 1 与导师 0 配对(得分 2)以及学生 2 与导师 1 配对(得分 3)。总兼容性:8

约束很小,所以我使用了生成所有学生组合的蛮力方法,来计算最大兼容性分数:

class Solution {
public:
    int check(vector<int>& s, vector<int>& m) {
        // calculates and returns max compatibility score
        int res=0;
        
        for(int i=0; i<s.size(); i++)
            if(s[i]==m[i]) res++;
        
        return res;
    }

    int maxCompatibilitySum(vector<vector<int>>& students, vector<vector<int>>& mentors) {
        int res=0;
        
        sort(students.begin(), students.end());
        do {
            int curr=0;
            // for(auto s: students) {
            //     for(auto val: s) {
            //         cout<<val<<" ";
            //     }
            //     cout<<"\n";
            // }

            for(auto s: students) {
                for(auto m: mentors) {
                    curr+=check(s, m);
                }
            }
            res=max(res, curr);
        } while(next_permutation(students.begin(), students.end()));
        
        return res;
    }
};

注释代码确实显示了正确生成的不同组合。但是我得到的输出是 14 而不是 8。有人可以指出我做错了什么吗?

1 个答案:

答案 0 :(得分:1)

我猜您想在每个排列中将每个学生与不同的导师配对。但这不是你在这里做的:

        for(auto s: students) {
            for(auto m: mentors) {
                curr+=check(s, m);
            }
        }

这两个循环计算与所有导师配对的所有学生的总和。在外循环的每次迭代中,这两个 for 循环产生相同的结果,因为 students 的顺序无关紧要。

我认为你想要这个:

  for (size_t i = 0; i < std::min(students.size(),mentors.size()); ++i) {
       curr += check( students[i], mentor[i]);
  }

这会将第 i 个学生与第 i 个导师配对。在 do 循环的下一次迭代中,会有不同的配对。

相关问题