typedef struct {
unsigned int weight; //用来存放各个结点的权值
unsigned int parent,LChild,RChild; //指向双亲、孩子结点的指针 } HTNode, *HuffmanTree; //动态分配数组,存储哈夫曼树
typedef char *HuffmanCode; //动态分配数组,存储哈夫曼编码
//选择两个parent为0,且weight最小的结点s1和s2 void Select(HuffmanTree *ht,int n,int *s1,int *s2) {
int i,min;
for(i=1; i<=n; i++) {
if((*ht)[i].parent==0) {
min=i; break; } }
for(i=1; i<=n; i++) {
if((*ht)[i].parent==0) {
if((*ht)[i].weight<(*ht)[min].weight) min=i; } }
*s1=min;
for(i=1; i<=n; i++) {
if((*ht)[i].parent==0 && i!=(*s1)) {
min=i; break; } }
for(i=1; i<=n; i++) {
if((*ht)[i].parent==0 && i!=(*s1)) {
if((*ht)[i].weight<(*ht)[min].weight) min=i; } }
*s2=min; }
//构造哈夫曼树ht,w存放已知的n个权值
void CrtHuffmanTree(HuffmanTree *ht,int *w,int n) {
int m,i,s1,s2;
m=2*n-1; //总共的结点数
*ht=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); for(i=1; i<=n; i++) //1--n号存放叶子结点,初始化 {
(*ht)[i].weight=w[i]; (*ht)[i].LChild=0; (*ht)[i].parent=0; (*ht)[i].RChild=0; }
for(i=n+1; i<=m; i++) //非叶子结点的初始化 {
(*ht)[i].weight=0; (*ht)[i].LChild=0; (*ht)[i].parent=0; (*ht)[i].RChild=0; }
printf(\"\\n哈夫曼树为: \\n\");
for(i=n+1; i<=m; i++) //创建非叶子结点,建哈夫曼树
{ //在(*ht)[1]~(*ht)[i-1]的范围内选择两个parent为0且weight最小的结点,其序号分别赋值给s1、s2
Select(ht,i-1,&s1,&s2);
(*ht)[s1].parent=i; (*ht)[s2].parent=i; (*ht)[i].LChild=s1; (*ht)[i].RChild=s2;
(*ht)[i].weight=(*ht)[s1].weight+(*ht)[s2].weight;
printf(\"%d (%d, %d)\\n\ }
printf(\"\\n\"); }
//从叶子结点到根,逆向求每个叶子结点对应的哈夫曼编码 void CrtHuffmanCode(HuffmanTree *ht, HuffmanCode *hc, int n) {
char *cd; //定义的存放编码的空间 int a[100];
int i,start,p,w=0; unsigned int c;
hc=(HuffmanCode *)malloc((n+1)*sizeof(char *)); //分配n个编码的头指针 cd=(char *)malloc(n*sizeof(char)); //分配求当前编码的工作空间 cd[n-1]='\\0'; //从右向左逐位存放编码,首先存放编码结束符
for(i=1; i<=n; i++) //求n个叶子结点对应的哈夫曼编码 {
a[i]=0;
start=n-1; //起始指针位置在最右边
for(c=i,p=(*ht)[i].parent; p!=0; c=p,p=(*ht)[p].parent) //从叶子到根结点求编码 {
if( (*ht)[p].LChild==c) { cd[--start]='1'; //左分支标1 a[i]++; } else { cd[--start]='0'; //右分支标0 a[i]++; } }
hc[i]=(char *)malloc((n-start)*sizeof(char)); //为第i个编码分配空间 strcpy(hc[i],&cd[start]); //将cd复制编码到hc }
free(cd);
for(i=1; i<=n; i++)
printf(\" 权值为%d的哈夫曼编码为:%s\\n\ for(i=1; i<=n; i++)
w+=(*ht)[i].weight*a[i];
printf(\" 带权路径为:%d\\n\ }
void main() {
HuffmanTree HT; HuffmanCode HC; int *w,i,n,wei;
printf(\"**哈夫曼编码**\\n\" ); printf(\"请输入结点个数:\" ); scanf(\"%d\
w=(int *)malloc((n+1)*sizeof(int));
printf(\"\\n输入这%d个元素的权值:\\n\
for(i=1; i<=n; i++) {
printf(\"%d: \ fflush(stdin);
scanf(\"%d\ w[i]=wei; }
CrtHuffmanTree(&HT,w,n); CrtHuffmanCode(&HT,&HC,n); }
2、删数问题
#includeint Del(int D,int a[10],int n)//D 删除几位 a 数组 n 当前数组位数 { int res,max,i,j,x[10]; for(i=0;i{max=0; j=0; for(i=0;ires=0;for(i=0;iint Res,D,z,n,m,i,a[10]; //m=43252556; i=0; n=0;printf(\"<------------------删数问题---------------------->\\n\"); printf(\"请输入一个高精度的正整数N(N<=10位):\"); scanf(\"%d\
printf(\"请输入要去掉数字的位数S(S<=N):\"); scanf(\"%d\while(1) { z=m/10; a[i]=m-z*10; m=z; i++; n++; if(m==0) break; }
Res=Del(D,a,n);
printf(\"删除后的结果为:\"); printf(\"%d\\n\
3贪心背包问题
#include #include #include int min(int w,int c) {int temp;if (wint max(int w,int c) {int temp;
if (w>c) temp=w; else temp=c; return temp; }
void knapsack(int v[],int w[],int c,int n,int**m) //求最优值 {
int jmax=min(w[n]-1,c); for(int j=0;j<=jmax;j++) m[n][j]=0;
for(int jj=w[n];jj<=c;jj++) m[n][jj]=v[n];
for(int i=n-1;i>1;i--){ //递归部分 jmax=min(w[i]-1,c); for(int j=0;j<=jmax;j++) m[i][j]=m[i+1][j]; for(int jj=w[i];jj<=c;jj++)
m[i][jj]=max(m[i+1][jj],m[i+1][jj-w[i]]+v[i]); }
m[1][c]=m[2][c]; if(c>=w[1])
m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]); cout<<\"最优值:\"<int traceback(int **m,int w[],int c,int n,int x[]) //回代,求最优解 {cout<<\"得到的一组最优解如下:\"<if(m[i][c]==m[i+1][c]) x[i]=0;else {x[i]=1; c-=w[i];}
x[n]=(m[n][c])?1:0; for(int y=1;y<=n;y++)
cout<void main() {int n,c; int **m;
cout<<\"请输入物品个数和重量上限:\"; cin>>n>>c;
int *v=new int[n+1];
cout<<\"请输入价值 (v[i]):\"<>v[i];int *w=new int[n+1];
cout<<\"请输入重量 (w[i]):\"<>w[j];int *x=new int[n+1];
m=new int*[n+1]; //动态的分配二维数组 for(int p=0;p