const int MAXN = 60; const int SIZE = 16; int ipt[110]; int dp[110][1 << SIZE]; int p[110][1 << SIZE]; int x[110][1 << SIZE]; int to[MAXN + 1]; int prime[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53}; map<int, int> mp; void init() { REP(i, SIZE) mp[prime[i]] = 1 << i; FE(ii, 0, MAXN) { int n = ii, ret = 0, i; for (i = 0; i < SIZE && prime[i] * prime[i] <= n; i++) if (n % prime[i] == 0) { while (n % prime[i] == 0) n /= prime[i]; ret += 1 << i; } if (n > 1) ret += mp[n]; to[ii] = ret; } } int n; void dfs(int idx, int id) { if (idx >= 2) dfs(idx - 1, p[idx][id]); printf("%d%c", x[idx][id], idx == n ? '\n' : ' '); } int main () { int all = 1 << SIZE; init(); while (~RI(n)) { FE(i, 1, n) RI(ipt[i]); CLR(dp, INF); dp[0][0] = 0; FE(i, 0, n - 1) { FF(j, 0, all) { FE(jj, 0, MAXN) { int v = to[jj]; if (j & v) continue; int val = dp[i][j] + abs(jj - ipt[i + 1]); int& nxt = dp[i + 1][j | v]; if (val < nxt) { nxt = val; p[i + 1][j | v] = j; x[i + 1][j | v] = jj; } } } } int ans = INF, id = 0; REP(j, all) { if (dp[n][j] < ans) { ans = dp[n][j]; id = j; } } dfs(n, id); } return 0; }
Codeforces Round #259 (Div. 1)——Little Pony and Harmony Chest,布布扣,bubuko.com
Codeforces Round #259 (Div. 1)——Little Pony and Harmony Chest
原文:http://blog.csdn.net/wty__/article/details/38346251