状态压缩动态规划
int cnt, stk[MAX];
void findStk(int n){ // 求出所有可能的状态。
for(int i = 0; i < (1<<n); i ++)
if(ok(i)){ // 判断这种状态可不可行。
stk[cnt] = i;
sum[cnt ++] = getSum(i); // 计算这种状态包含了几个炮兵。
}
}
bool ok(int x){ // 判断状态x是否符合,即是否会出现两个大炮间隔小于2。
if(x & (x<<1)) return false;
if(x & (x<<2)) return false;
return true;
}
int getSum(int x){ // 求出状态x中安装了多少门大炮,x的二进制有几个1。
int num = 0;
while(x > 0){
if(x & 1) num ++;
x >>= 1;
}
return num;
}
经典问题:TSP
由于只有16个点,所以我们用一个整数表示一个点集:
例如:
所以一个整数i就表示了一个点集;整数i可以表示一个点集,也可以表示是第i个点。
dp[i][j]表示经过点集i中的点恰好一次,不经过其它的点,并且以j点为终点的路径,权值和的最小值,如果这个状态不存在,就是无穷大。