#include <bits/stdc++.h>
using namespace std;
const int maxC = 8;
const int maxS = 16;
struct Centifuge {
int num;//装了几件样品
int totSum;//样品的总重量
int load[3];//每个房间装载的样品的重量
};
Centifuge cents[maxC];//房间数组
Centifuge pritCents[maxC];//房间数组
int spec[maxS];//样品数组
int C, S;
double imb;
double aver;
void initCents() {
for(int i = 0; i < C; ++i) {
cents[i].num = 0;
cents[i].totSum = 0;
pritCents[i].num = 0;
pritCents[i].totSum = 0;
for(int i = 0; i < 3; ++i){
cents[i].load[i] = 0;
pritCents[i].load[i] = 0;
}
}
}
void copyCents(Centifuge dest[], Centifuge src[]) {
for(int i = 0; i < C; ++i) {
dest[i].num = src[i].num;
dest[i].totSum = src[i].totSum;
for(int j = 0; j < 3; ++j){
dest[i].load[j] = src[i].load[j];
}
}
}
void outPut(int No) {
printf("Set #%d\n", No);
for(int i = 0; i < C; ++i) {
printf(" %d:", i);
for(int j = 0; j < pritCents[i].num; j++) {
printf(" %d", pritCents[i].load[j] );
}
printf("\n");
}
printf("IMBALANCE = %.5f\n\n", imb);
}
void dfs(int cur) {//当前考虑第cur号样品
if(cur == S) {//找到了一中可行的方案
double sum = 0;
for(int i = 0; i < C; i++) {
sum += fabs(cents[i].totSum - aver);
}
if(sum >= imb)//这个方案不可取
return;
else {
imb = sum;
copyCents(pritCents, cents);//最终采用的方案
return;
}
}
for(int i = 0; i < C; ++i) {//把当前样品往i号房间放
if(cents[i].num == 2)
continue;
//放
cents[i].load[cents[i].num] = spec[cur];
cents[i].num += 1;
cents[i].totSum += spec[cur];
dfs(cur+1);
//回溯
cents[i].num -= 1;
cents[i].load[cents[i].num] = 0;
cents[i].totSum -= spec[cur];
}
}
int main( ) {
//freopen("data.in", "r", stdin);
int No = 1;
while(scanf("%d %d", &C, &S) == 2) {
double sum = 0.0;
memset(spec, 0, sizeof(spec));
for(int i = 0; i < S; ++i) {
scanf("%d", &spec[i]);
sum += spec[i];
}
aver = sum / C;
imb = 9999999.9;
initCents();
dfs(0);
outPut(No);
No++;
}
return 0;
}
HDU 1167 Station Balance(DFS)
最新推荐文章于 2020-07-30 17:50:00 发布