小 Q 面臨一系列挑戰,需要在有限資源下做出最優決策。經分析,本題屬於狀態壓縮動態規劃 (DP on Subsets) 經典模型。
#include
using namespace std;
const int INF = 0x3f3f3f3f;
int n, m;
vector> cost; // cost[i][j] 或類似
int dp[1<<20]; // 狀態空間
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
cost.assign(n, vector(n));
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> cost[i][j];
// 初始化
fill(dp, dp + (1<
add[mask][k] 避免重複計算。for (int cnt=0; cnt 保證依賴已算。__builtin_popcount 快速計數。 dp[mask] + heuristic >= ans 跳過。| 變體 | 狀態定義 | 轉移 |
|---|---|---|
| 旅行商問題 (TSP) | dp[mask][i] 到達 i 經過 mask | dp[mask\|1< |
| 任務分配 | dp[mask] 前 k 人完成 mask 任務 | dp[mask\|1< |
| 集合覆蓋 | dp[mask] 覆蓋 mask 最小集合數 | dp[mask\|sub] = min(dp[mask] + 1) |
assert 檢查狀態合法性。