标签:std 一台 int since P3052 system Cows 电梯 USACO12MAR
看到这个数据范围,显然状压
用\(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;
}
}
标签:std,一台,int,since,P3052,system,Cows,电梯,USACO12MAR 来源: https://www.cnblogs.com/QQ2519/p/15466189.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。