初步认知,有些东西需要集合来表示但是不太方便
比如说00010001000100001 又1的地方就代表这个数在这个集合中存在,于是乎我们就可以用一个数字表示一个集合了。
例题
旅行商问题
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 20, M = 1<<20;
int n;
int f[M][N] , weight[N][N];
int main() {
cin>>n;
for (int i=0;i<n;i++) {
for (int j=0; j<n ;j++) {
cin>>weight[i][j];
}
}
memset(f, 0x3f,sizeof(f));
f[1][0] = 0;
for (int i= 0 ;i< 1<<n ; i++) {
for (int j=0; j<n; j++) {
if (i >> j & 1) {
for (int k=0; k<n ;k++) {
if (i-(1<<j)>>k &1 ) {
f[i][j] = min(f[i][j], f[i-(1<<j)][k] + weight[k][j]);
}
}
}
}
}
cout<<f[(1<<n) - 1][n-1]<<endl;
return 0;
}
|