// Fano.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
using namespace std;
void input();
double enta();
void sort();
char codes[12];
struct inf
{
char des[20];
double p;
char code[12];
};
vector sign(0);
void input()
{
int i=1,j;
double sum=0;
cout<
cin>>i;
for(j=0;j
{
inf temp;
cout<
cin>>temp.des;
do
{
cout<
cin>>temp.p;
}while(temp.p<=0||temp.p>=1);
strcpy(temp.code,codes);
sign.push_back(temp);
}
for(j=0;j
sum+=sign[j].p;
if(sum==1)
return;
else
{
cout<
sign.clear();
input();
}
}
void sort()
{
inf temp;
int i,j;
for(i=0;i
for(j=i+1;j
{
if(sign[i].p
{
temp=sign[i];
sign[i]=sign[j];
sign[j]=temp;
}
}
}
double enta()
{
double hx=0,k=0;
int i;
for(i=0;i
{
hx+=(-sign[i].p*log(sign[i].p)/log(2));
k+=(sign[i].p*(strlen(sign[i].code)));
}
return hx/k;
}
void findcode(int start,int end,int position)
{
if(start>=end) return;
else
{
int i,middle;
double sum=0,sum1=0,dlast,dnow;
for(i=start;i<=end;i++)
sum+=sign[i-1].p;
dlast=sum;
for(middle=start;middle<=end;middle++)
{
sum1+=sign[middle-1].p;
dnow=fabs(sum-2*sum1);
if(dnow>dlast) break;
dlast=dnow;
}
middle--;
if(position<=middle)
{
strcat(sign[position-1].code,"0");
end=middle;
}
else
{
strcat(sign[position-1].code,"1");
start=middle+1;
}
findcode(start,end,position);
}
}
void main()
{
bool flag=0;
char ch;
do
{
system("cls");
cout<
input();
sort();
int i;
for(i=0;i
{
findcode(1,sign.size(),i