本文共 1460 字,大约阅读时间需要 4 分钟。
给出一个序列a,求取一个序列b,b序列的数两两互质,问能够导致 ∑|ai−bi| 最小的方案
#include#include #include #include #include #define MAX 107using namespace std;int n,a[MAX];int dp[107][1<<17];int pre[107][1<<17];int num[107][1<<17];int prime[]={ 2,3,5,7,11,13,17,19,23,29,31,37,39,41,43,47,53};int state[60];void print ( int i ,int u ){ if ( i == 1 ) { printf ( "%d " , num[i][u] ); return; } print ( i-1 , pre[i][u] ); printf ( "%d " , num[i][u] );}int main ( ){ while ( ~scanf ( "%d" , &n ) ) { for ( int i = 1 ; i <= n ; i++ ) scanf ( "%d" , &a[i] ); memset ( dp , 0x3f , sizeof ( dp ) ); int INF = dp[0][0]; dp[0][0] = 0; memset ( state , 0 , sizeof ( state ) ); for ( int i = 2 ; i < 60 ; i ++ ) for ( int j = 0; j < 17 ; j++ ) if ( i%prime[j] == 0 ) state[i] |= (1< dp[i][j] + abs ( a[i+1] - k ) ) { dp[i+1][x] = dp[i][j] + abs ( a[i+1] - k ); pre[i+1][x] = j; num[i+1][x] = k; } } } int ans = INF,loc = -1; for ( int i = 0 ; i < total ; i++ ) if ( ans > dp[n][i] ) { ans = dp[n][i]; loc = i; } print ( n , loc ); puts (""); }}
转载地址:http://mqvjn.baihongyu.com/