我来细细讲讲01串枚举:
所谓01串枚举,就是我们在每个个体都面对两种选择的时候,可以用一个01串表示,比如说对于本题,每一行有选和不选两种可能,假设有5行的话,我们就可以用一个长度为5的01串来表示,0表示不选1表示选,就像一个bool数组一样,如:01001 表明第134行不选,第25行要选。
只是用一个数字来表示比用数字表示方便,为什么方便呢?因为所有长度小于n的01串,转成十进制之后就是所有小于2^n 的数字,这样从0到2^n-1
枚举数字就是从00…00枚举到11…11。这样比写个搜索枚举所有选和不选的情况快乐吧!
题目链接:https://ac.nowcoder.com/acm/contest/4090/C
#include<bits/stdc++.h>
using namespace std;
int n, m ,k;
int a[20][20];
long long sh[20],sl[20];//sh[i]是第i行的和,sl[i]是第i列的和(在行选完之后用)
bool b[20];//b[i]是01串转换过来的bool数组(用bool数组主要是为了方便大家理解)
long long ans = 0; //存答案,注意总和会超过int的最大值要用long long
int deal(int x) //把x这个数字转换成bool数组
{
memset(b, 0, sizeof(b)); //不清数组会死!
int cnt = 0, i = 1; //cnt存01串里面1的个数
while (x)
{
if
记一个比较好的枚举方法
最新推荐文章于 2023-05-09 21:55:10 发布