P3052 [USACO12MAR]Cows in a Skyscraper G
阿新 • • 發佈:2021-10-26
看到這個資料範圍,顯然狀壓
用\(f[i][j]\)表示開了i個電梯,裝的牛的集合為j,每次往最後一臺電梯加入牛,讓最後一臺電梯的重量為\(f[i][j]\)
std::mt19937 r(std::chrono::system_clock::now().time_since_epoch().count()); const int N = 21; int n, W, w[N]; namespace DP { int f[19][1 << 19], mx; //¿ªÁËi¸öµçÌÝ£¬Ñ¡ÁËj¼¯ºÏÀïÃæµÄÅ££¬ÖØÁ¿Îªfij int main() { memset(f, 0x3f, sizeof f); mx = (1 << n) - 1; rep(i, 1, n) { f[1][1 << (i - 1)] = w[i]; } rep(i, 1, n) { //µçÌÝÊý rep(j, 0, mx) { if(f[i][j] > 1e9) continue; rep(k, 1, n) { if(j & (1 << (k - 1))) continue; if(f[i][j] + w[k] <= W) { f[i][j | 1 << (k - 1)] = min(f[i][j | 1 << (k - 1)], f[i][j] + w[k]); } else { f[i + 1][j | 1 << (k - 1)] = min(f[i][j | 1 << (k - 1)], w[k]); } } } } rep(i, 1, n) { if(f[i][mx] < 1e9) { out(i, '\n'); break; } } return 0; } } namespace rnd { int main() { int t = clock(); int ans(n); while(clock() - t < CLOCKS_PER_SEC * 0.98) { srand(r()); int g(0), num(1); rep(i, 1, n) { if(g + w[i] <= W) { g += w[i]; } else { g = w[i]; ++num; } } ans = min(ans, num); std::random_shuffle(w + 1, w + n + 1); } out(ans, '\n'); return 0; } }
本文來自部落格園,作者:{2519},轉載請註明原文連結:https://www.cnblogs.com/QQ2519/p/15466189.html