为什么一遍SA也不跑
查看原帖
为什么一遍SA也不跑
70081
尹昱钦楼主2021/7/17 20:58
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<ctime>
#include<iomanip>
#include<cstdlib>
using namespace std;
const double delta=0.996;
int n,m,a[25],d[25];
double ans=1e18,suma,dp[25][25];
double cal(){
	memset(dp,0x3f,sizeof(dp));
	dp[0][0]=0;
	for(int i=1;i<=n;i++) d[i]=d[i-1]+a[i];
	for(int i=1;i<=n;i++){
		for(int j=1;j<=min(i,m);j++){
			for(int k=0;k<i;k++){
				dp[i][j]=min(dp[i][j],dp[k][j-1]+((d[i]-d[k])-suma/m)*((d[i]-d[k])-suma/m));
			}
		}
	}
	return dp[n][m];
}
void SA(){
	ans=min(ans,cal());
	double t=3000;
	while(t>1e-15){
		int x=rand()%n+1,y=rand()%n+1;
		swap(a[x],a[y]);
		double res=cal();
		double cha=res-ans;
		if(cha<0) ans=res;
		else{
			if(exp(-cha/t)*RAND_MAX<rand()) 
				swap(a[x],a[y]);
		}
		t*=delta;
	}
}
int main(){
	srand(19260817);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),suma+=a[i];
	while((double)clock()/CLOCKS_PER_SEC<0.8) SA();
	printf("%.2lf",sqrt(ans/m));
	return 0;
}

2021/7/17 20:58
加载中...