土豆先生开了两家新店卖土豆。他买了N袋土豆,其中第i 袋价值为 ai,袋里有ci个土豆。他打算把这N袋土豆整袋整袋地分在两个店里。
在每家店中,土豆的平均价格等于这家店里所有袋的土豆的总价比上土豆的个数。(注意是个数而不是袋数!)
设P1为第一家店的土豆平均价格,P2为第二家店的土豆平均价格。土豆先生希望在至少有一家店里土豆袋数正好等于L袋的情况下,最小化P1×P2的值。
这题明摆着退火(N≤100)我什么我的程序爆零?求
#include<bits/stdc++.h>
using namespace std;
const double start=1e5;
const double eps=1e-7;
const double drop=0.99;
int n,l1,l2;
double ans=1919810.0;
struct pot{
int val,gs;
}m1[101],m2[101];
double cnt(){
int gs1=0,gs2=0,val1=0,val2=0;
for(int i=0;i<l1;i++) val1+=m1[i].val,gs1+=m1[i].gs;
for(int i=0;i<l2;i++) val2+=m2[i].val,gs2+=m2[i].gs;
return (1.0*val1/gs1)*(1.0*val2/gs2);
}
void SA(){
double ntemp=start,cale;
for(;ntemp>eps;ntemp*=drop){
int i1=rand()%l1,i2=rand()%l2;
swap(m1[i1],m2[i2]);
cale=cnt();
if(cale<ans){
ans=cale;
continue;
}
else{
if(exp((cale-ans)*start/ntemp)<rand()/32768.0){
swap(m1[i1],m2[i2]);
}
}
}
}
int main(){
srand(time(0));
cin>>n>>l1; l2=n-l1;
for(int i=0;i<l1;i++) cin>>m1[i].gs;
for(int i=0;i<l2;i++) cin>>m2[i].gs;
for(int i=0;i<l1;i++) cin>>m1[i].val;
for(int i=0;i<l2;i++) cin>>m2[i].val;
for(int i=0;i<l1*l2*n;i++){
SA();
}
cout<<fixed<<setprecision(3)<<ans<<endl;
for(int i=0;i<l1;i++){
cout<<m1[i].gs<<" "<<m1[i].val<<endl;
}
cout<<endl;
for(int i=0;i<l2;i++){
cout<<m2[i].gs<<" "<<m2[i].val<<endl;
}
}