题目

农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数L i
​ 个长度单位,于是他购买了一条很长的、能锯成N块的木头,即该木头的长度是L i的总和。但是农夫自己没有锯子,请人锯木的酬金跟这段木头的长度成正比。为简单起见,不妨就设酬金等于所锯木头的长度。例如,要将长度为20的木头锯成长度为8、7和5的三段,第一次锯木头花费20,将木头锯成12和8;第二次锯木头花费12,将长度为12的木头锯成7和5,总花费为32。如果第一次将木头锯成15和5,则第二次锯木头花费15,总花费为35(大于32)。
请编写程序帮助农夫计算将木头锯成N块的最少花费

分析

*通过读题可知,此题大意就是要创建一个Huffman树,然后求它的最短带权路径长度(WPL)。

思路

本题实验思路其实很简单,就是循环找数组中两个最小的点创建树,取到最小节点后要将其置空(就是以后不再扫描此节点,表示数组此处已经为空),节点数组处是否为空我用了一个flag[ ]数组进行标记,如果为1则表示节点数组处此值可用,反之则已经为空。

代码

#include<stdio.h>
#include<stdlib.h>
#define N 100
#define Max 51
typedef struct Tree{int data;struct Tree *lchild,*rchild;
}*BiTree,tree;
BiTree CreatHuffman();
int findMin();
void PreSearch(BiTree TT,int level);BiTree T[N],root;
int n,flag[N],count=0;
void main(){int i;BiTree s;scanf("%d",&n);for(i=0;i<n;i++){s=(BiTree)malloc(sizeof(tree));scanf("%d",& s->data);s->lchild=NULL;s->rchild=NULL;T[i]=s;flag[i]=1;}root=CreatHuffman();printf("HuffmanTree PreSearch\n");PreSearch(root,0);printf("\n");printf("总花费=%d ",count);system("pause");
}BiTree CreatHuffman(){//创建一棵Huffman树int min1,min2,i;BiTree TT;while(1){//循环找到数组中最小的两个点min1=findMin();min2=findMin();if(min2==-1){//用于判断数组中是不是只剩余一个节点可用,若是则此节点就是根节点return T[min1];}TT=(BiTree)malloc(sizeof(tree)); //以最小两节点为叶子节点共同构建一个父节点,创建一棵树TT->data=T[min1]->data+T[min2]->data;TT->lchild=T[min1];TT->rchild=T[min2];T[min1]=TT;flag[min1]=1;//插入一个数后,此处别忘了置1,代表新加入节点参与最小值的检索}return NULL;
}int findMin(){int i,min=Max,index=-1;for(i=0;i<n;i++){if(flag[i]==1 && T[i]->data<min){min=T[i]->data;index=i;}}if(index != -1){flag[index]=0;return index;}elsereturn -1;
}void PreSearch(BiTree TT,int level){if(!TT)return;printf("%d ",TT->data);if(!TT->lchild && !TT->rchild)count+=TT->data * level;PreSearch(TT->lchild,level+1);PreSearch(TT->rchild,level+1);
}

基础实验4-2.7 修理牧场相关推荐

  1. 数据结构PTA习题:基础实验4-2.7 修理牧场 (25分)

    基础实验4-2.7 修理牧场 (25分) 农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数L​i​​个长度单位,于是他购买了一条很长的.能锯成N块的木头,即该木头的长度是L ...

  2. 【两种方法】基础实验4-2.7 修理牧场 (25 分)

    立志用最少的代码做最高效的表达 农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数L​i个长度单位,于是他购买了一条很长的.能锯成N块的木头,即该木头的长度是Li的总和. 但 ...

  3. 7-29 修理牧场 (25分)(PTA实验题)

    7-29 修理牧场 (25分) 农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数Li ​​ 个长度单位,于是他购买了一条很长的.能锯成N块的木头,即该木头的长度是Li ​​ ...

  4. 7-1 修理牧场 (25 分)(最详解)(最容易理解的解题过程)

    7-1 修理牧场 (25 分)(最详解)(最容易理解的解题过程) 农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数L​i​​个长度单位,于是他购买了一条很长的.能锯成N块的 ...

  5. [nRF51822] 8、基础实验代码解析大全 · 实验11 - PPI

    前一篇分析了前十个基础实验的代码,从这里开始分析后十个~ 一.PPI原理: PPI(Programmable Peripheral Interconnect),中文翻译为可编程外设互连. 在nRF51 ...

  6. 计算机应用基础实验报告册,计算机应用基础实验报告(flash)

    实 验 报 告 计算机应用基础实验报告 姓名 班级 学号 实验日期 课程名称 计算机应用基础 指导教师 成绩 实验名称:简单动画制作 实验目的: 掌握逐帧动画.形状渐变动画.运动渐变动画的制作方法 实 ...

  7. Grove Beginner Kits基础实验 Arduino

    简 介: 本文就Arduino的基础实验以及与ESP8266连接进行了初步实验.并基于此,给出了基于人脸识别只能门锁系统的硬件设计. 关键词: Arduino,ESP8266 §01 Arduino ...

  8. ESP8266的一些MicroPython基础实验

    文章目录 ▌ESP8266模块 1.模块基本信息 2.模块管脚配置 ▌02 基础实验 1.测试GPIO (1)ON_OFF实验 (2)端口中断 2.测试PWM 3.测试ADC (1)基础的ADC (2 ...

  9. 计算机网络基础实验简答题,计算机网络基础实验报告.doc

    计算机网络基础实验报告 计算机科学与技术系 实 验 报 告专业名称课程名称计算机网络基础项目名称局域网组网实验班 级学 号姓 名同组人员实验日期实验目的与要求: (一).实验目的: 通过组建局域网,了 ...

最新文章

  1. win8系统服务器地址怎么查,win8服务器地址怎么查
  2. 1. CMake 系列 - 从零构建动态库和静态库
  3. rmi 反序列化漏洞_IDEA动态调试(二)——反序列化漏洞(Fastjson)
  4. 动态规划总结与题目分类
  5. bailian 2754八皇后
  6. linux ruby gem 安装目录,linux 安装 gem
  7. 在Netbeans下配置Tomcat manager用户名与密码
  8. Morpheus:虚拟现实的新杀器
  9. C# Invoke 使用 异步委托
  10. 四万字Hive调优全方位指南(推荐收藏)
  11. Python 网络爬虫与数据采集(一)
  12. Java常量池与方法区
  13. Python基础 模块化编程(模块的导入)
  14. 【源码汇总】基于RGB-D相机的三维重建总览 包括静态与动态三维重建
  15. centos安装git时出错提示make[1]: *** [perl.mak] Error 2
  16. android自动夜间模式,Android实现日夜间模式的深入理解
  17. mysql朋友圈数据库设计_实现微信朋友圈可见不可见的数据库设计及ORM语句
  18. 坐南京13路公交车,体验《头文字D》感觉!
  19. 基于机器学习的锂离子电池健康状态预测:进展与展望
  20. B-样条基函数:定义 (B-spline Basis Functions: Definition)

热门文章

  1. 添加完商品后,点货品显示此商品不存在规格,请为其添加规格?
  2. Js 跟手转动的罗盘指针
  3. 900句--熟背后交流无障碍
  4. 从龟速 11s 到闪电 1s,详解前端性能优化之首屏加载
  5. 【数学建模】多元线性回归(PythonMatlab代码实现)
  6. 关于zip包解压之后文件打开出现文件损坏的问题
  7. 小白学机器学习西瓜书-第三章对数几率回归
  8. 最全的盲埋孔板工艺介绍与设计原则​​​​​​​
  9. java jfreechart 折线图_java程序使用JfreeChart画折线图
  10. js下载文件方法记录