if(a[i]!=-1){printf(\"%d\\n\}
10、给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。有4个权值为{2,7,5,4}叶子节点,编写程序试构造一颗哈夫曼树。
11、已知6种物品和一个可容纳60重量的背包,物品i的重量为wi,产生的效益为pi。在装包时物品i
可以装入,也可以不装,但不可拆开装。即物品i可产生的效益为xi*pi,这里xi属于{0,1},c,wi,pi属于N+。设计如何装包,所得装包总效益最大。相关参数见下表 W1 W2 W3 W4 W5 W6 #include \"stdio.h\" #define N 50 void main () {
int i,j,c,cw,n,sw,sp,p[N],w[N],m[N][10*N]; printf (\"input n:\"); scanf (\"%d\printf (\"input c:\"); scanf (\"%d\for (i=1;i<=n;i++)
15 17 20 12 9 14 P1 P2 P3 P4 P5 P6 32 37 46 26 21 30 }
{ }
for (j=0;j<=c;j++)
if (j>=w[n])
m[n][j]=p[n]; m[n][j]=0; for (j=0;j<=c;j++)
if (j>=w[i] && m[i+1][j]m[i][j]=m[i+1][j-w[i]]+p[i]; m[i][j]=m[i+1][j]; else cw=c;printf (\"c=%d\\n\printf (\"背包所装物品:\\n\"); printf (\"i w(i) p(i)\\n\"); for (sp=0,sw=0,i=1;i<=n-1;i++)
if (m[i][cw] > m[i+1][cw]) { }
if (m[1][c]-sp==p[n]) { }
printf (\"w=%d,pmax=%d\\n\
sw+=w[i];sp+=p[i];
printf (\"%d%3d %4d\\n\cw-=w[i];sw+=w[i];sp+=p[i]; printf (\"%d%3d %4d\\n\
else
for (i=n-1;i>=1;i--)
printf (\"input w%d,p%d:\scanf (\"%d,%d\
12、(贪心算法)已知5种物品和一个可容纳90重量的背包,物品i的重量为wi,产生的效益为pi。在装包时物品i可拆开装。即可只装每种物品的一部分,物品i的一部分可产生的效益为xipi,这里xi属于{0,1},pi大于0。设计如何装包,所得装包总效益最大。相关参数见下表 W1 W2 W3 W4 P1 P2 P3 P4 32.5 25.3 37.4 41.3 28.2 56.2 40.5 70.8 78.4 40.2 W5 P5 //可拆背包程序实现 #include #define N 100 void main() { float p[N],w[N],x[N],c,cw,s,h; int i,j,n; printf(\"input n:\"); scanf(\"%d\ printf(\"input c:\"); scanf(\"%f\ for(i=1;i<=n;i++) { printf(\"input w%d,p%d:\ scanf(\"%f,%f\ } for(i=1;i<=n-1;i++) for(j=i+1;j<=n;j++) if(p[i]/w[i]cw)break; x[i]=1.0; cw=cw-w[i]; s=s+p[i]; } x[i]=(float)(cw/w[i]);
s=s+p[i]*x[i]; printf(\"装包:\"); for(i=1;i<=n;i++) if(x[i]<1)break; else printf(\"\\n装入重量为%5.1f效益为%5.1f的物品.\ if(x[i]>0&&x[i]<1) printf(\"\\n装入重量为%5.1f效益为%5.1f的物品百分之%5.1f.\ }
printf(\"\\n所得最大效益为:%7.1f\