題意:旅行商問題,即從 \(1\) 走到 \(n\) 不重不漏,然後求最小距離。
題解:狀態壓縮dp,顯然的是,要從某種狀態到某種狀態並且合法,然後取 \(min\),然後全部遍歷。所以設 \(dp_\) 的含義是,最後乙個點是 \(i\) 點,然後走過了 \(j\) 這個 \(01\) 串的有 \(1\) 的點。然後要想的是順序問題,那麼我們必然是從上乙個點推到 \(i\) 點,所以可以遍歷所有點,然後得到 \(k\) 點,\(k\) 點一定是在這個 \(j\) 裡面,然後那麼 $$dp_ = min, dp_}$$。
**:
#include #include #include #include #include #include using namespace std;
typedef long long ll;
const int n = 21;
int dp[n][1 << n];
int w[n][n];
void solve()
}memset(dp, 0x3f, sizeof dp);
dp[0][1] = 0;
for (int j = 0; j < 1 << n; j++) }}
}}
cout << dp[n - 1][(1 << n) - 1] << endl;
}int main()
題意:旅行商問題裸題,只不過多出來一項操作是不重不漏走完,並且還要回到原點,也沒啥,如果理解了旅行商問題的 \(dp\) 方程代表含義,就很簡單。
**:
#include #include #include #include #include #include using namespace std;
typedef long long ll;
const ll n = 29;
struct node a[22];
bool check(ll j, ll k, ll n) }}
}return 1;
}ll w[n][n];
ll dp[n][1 << 18];
void solve()
}memset(dp , 0x3f, sizeof dp);
dp[0][1] = 0;
for (ll j = 0; j < 1 << n; j++) }}
}ll ans = 0x7fffffff;
for (ll i = 1; i < n; i++) ans = min(ans, dp[i][ (1 << n) - 1] + w[i][0]);//多出來了這個,就是知道了dp陣列含義後,就很簡單
cout << ans << endl;
}signed main()
旅行商問題
旅行商問題 乙個商人從城市a出發,訪問bcde等城市各一次最後回到a,問行程如何使得路程或費用最低。這是個np 非多項式可解,但一般驗證容易 問題,假設中間有4個城市,那麼全排列為4!24種,沒有很好的演算法,基本只能窮舉了。class vertex 4 public class lianxi pu...
旅行商問題
一銷售商從n個城市中的某一城市出發,不重複地走完其餘n 1個城市並回到原出發點,在所有可能的路徑中求出路徑長度最短的一條。本題假定該旅行商從第1個城市出發。對每個測試例,第1行有兩個整數 n 4 n 10 和m 4 m 20 n是結點數,m是邊數。接下來m行,描述邊的關係,每行3個整數 i,j le...
旅行商問題(貪婪法)
h greedytsp.h created on 2011 7 12 author 哈哈 ifndef greedytsp h define greedytsp h include using namespace std include include void printstate vector ...