1、贪心算法
//贪心算法装箱问题
#include<stdio.h>
#include<stdlib.h>
#define V 100
//物品体积
typedef struct
{
int gno;//物品编号
int gv;//物品体积
}ELE;
//物品结点
typedef struct goods
{
int vno;
struct goods * link;
}GOODS;
//箱子结点
typedef struct box
{
int remainder;//剩余体积
GOODS * hg;
struct box * next;
}BOX;
void printELE(ELE * head,int n)
{
int i;
for(i=0;i<n;i++)
printf("%d,%d\n",head[i].gno,head[i].gv);
}
void printBOX(BOX * head)
{
BOX * p=head;
int i=1;
while(p)
{
printf("\n第%d个箱子剩余%d\t",i++,p->remainder);
while(p->hg)
{
printf("这个箱子装了%d\t",p->hg->vno);
p->hg=p->hg->link;
}
p=p->next;
}
}
//降序排序
void sortD(ELE * g,int n)
{
int i;
int j;
ELE t;
for(i=0;i<n-1;i++)
for(j=0;j<n-i;j++)
if(g[j].gv<g[j+1].gv)
{
t=g[j];
g[j]=g[j+1];
g[j+1]=t;
}
}
//装箱
BOX * process(ELE * g,int n)
{
int i;
BOX * h=NULL,* t,* p,* k;
GOODS * q,* m;
for(i=0;i<n;i++)
{
q=(GOODS *)malloc(sizeof(GOODS));//先给物品分配
q->vno=g[i].gno;
q->link=NULL;
for(k=h;k&&k->remainder<g[i].gv;k=k->next);//没开箱子的情况,即K为NULL,或者找出能放下的第一个箱子
if(!k)//这里是一个箱子都没开
{
p=(BOX *)malloc(sizeof(BOX));//开箱
p->remainder=V;
p->next=NULL;
if(!h)//是不是第一个箱子
h=t=p;
else
t=t->next=p;//不是直接挂,t指向最后一个箱子
t->next=NULL;
p->hg=q;
p->remainder=V-g[i].gv;//放入物品
}
else//这个是有箱子,并且能放下
{
for(m=k->hg;m->link;m=m->link);
m->link=q;
k->remainder-=g[i].gv;
}
}
return h;
}
int main(void)
{
ELE * g=NULL;
BOX * b=NULL;
int i;
int n;
printf("请输入物品个数:\n");
scanf("%d",&n);
g=(ELE *)malloc(n*sizeof(ELE));
//输入物品数据
for(i=0;i<n;i++)
{
g[i].gno=i+1;
printf("请输入第%d个物品的体积:",i+1);
scanf("%d",&g[i].gv);
}
printELE(g,n);
sortD(g,n);
printELE(g,n);
b=process(g,n);
printBOX(b);
}
2、哈弗曼编码
//哈夫曼编码,利用结构体数组存储哈夫曼树
//用另一个结构体存储编码
#include<stdio.h>
#include<stdlib.h>
#define N 10
typedef struct
{
char word;//存储字符
int weight;
int left,right,parent;
}HuffNode;
typedef struct
{
int code[N];
int start;
}HuffCode;
void CreatHuffManTree(HuffNode * hn,int n)
{
int i;
int j;
int k1;
int k2;
for(i=0;i<n-1;i++)
{
k1=k2=-1;
for(j=0;j<n+i;j++)
{
if(hn[j].parent==-1&&k1==-1)
k1=j;
else if(hn[j].parent==-1)
{
k2=j;
break;
}
for(;j<n+i;j++)
if(hn[j].parent==-1)
if(hn[j].weight<hn[k1].weight)
{
k2=k1;k1=j;
}
else if(hn[j].weight<hn[k2].weight)
k2=j;
hn[n+i].weight=hn[k1].weight+hn[k2].weight;
hn[n+i].parent=-1;
hn[n+i].left=k1;
hn[n+i].right=k2;
hn[k1].parent=hn[k2].parent=n+i;
}
}
}
void CreatHuffManCode(HuffNode * hn,int n,HuffCode * hc)
{
int i;
int c;
int p;
for(i=0;i<n;i++)
{
c=i;
p=hn[c].parent;
hc[i].start=N;
while(p!=-1)
{
if(hn[p].left==c)
hc[i].code[--hc[i].start]=0;
else
hc[i].code[-