还是神奇的随机算法,,(看视频说这是爬山法??)
其实就是把序列随机分成两半(我太弱,只知道random_shuffle),然后再每个序列里rand一个位置,x,y然后比较是不是交换之后是更优的。
然后重复这个过程。
神奇。。
1 #include<cstdio> 2 #include<cstring> 3 #include<ctime> 4 #include<iostream> 5 #include<algorithm> 6 #define LL long long 7 using namespace std; 8 9 int n,q[505],a[505],b[505],ans1,ans2,ans; 10 11 int main() 12 { 13 cin>>n; 14 for (int i=1; i<=n; i++) scanf("%d",&q[i]); 15 int CNT=50; 16 while (CNT--) 17 { 18 random_shuffle(q+1,q+n+1); 19 int lena=0,lenb=0,suma=0,sumb=0; 20 for (int i=1; i<=n/2; i++) a[++lena]=q[i],suma+=q[i]; 21 for (int i=n/2+1; i<=n; i++) b[++lenb]=q[i],sumb+=q[i]; 22 int cnt=10000; ans=1e9; 23 while (cnt--) 24 { 25 int x=rand()%lena+1,y=rand()%lenb+1; 26 if (abs(suma-a[x]+b[y]-(sumb-b[y]+a[x]))<abs(suma-sumb)) 27 suma=suma-a[x]+b[y],sumb=sumb-b[y]+a[x],swap(a[x],b[y]); 28 } 29 if (abs(suma-sumb)<ans) ans1=suma,ans2=sumb,ans=abs(suma-sumb); 30 } 31 if (ans1>ans2) swap(ans1,ans2); 32 printf("%d %d\n",ans1,ans2); 33 }
原文:http://www.cnblogs.com/ccd2333/p/6731438.html