分支限界算法c语言_【干货屋】C语言学习心得

作为一个刚学完c语言的大二学生,我个人认为学习C语言最要注意在学习后面的知识时,不要忘了回头弄清遗留下的问题和加深理解前面的知识,这是我们最不易做到的,然而却又是最重要的。学习C语言就是要经过几个反复,才能前后贯穿,积累应该掌握的C知识。下面我为大家整理了一部分学习c语言的重点内容。

d5f83f836db323d0f90356be7891c3be.png

一、学好C语言的运算符和运算顺序

当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。先要明确运算符按优先级不同分类,《C程序设计》运算符可分为15种优先级,从高到低,优先级为1 ~ 15,除第2、3级和第14级为从右至左结合外,其它都是从左至右结合,它决定同级运算符的运算顺序。

672e485ba53634a792f5beb1d8c24957.png dff4a893397278ebc791558f46847206.png

二、学好C语言的四种程序结构

1、顺序结构

顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。

2、分支结构

顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构。分支结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序。

3、循环结构

循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do –while循环和for循环。

3af8aa93024c146af5c9cd010585a8bb.png

4、模块化程序结构

C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写,因此常说:C程序=主函数+子函数。因此,对函数的定义、调用、值的返回等中要尤其注重理解和应用,并通过上机调试加以巩固。

常用的三种循环结构学习的重点在于弄清它们相同与不同之处,以便在不同场合下使用,这就要清楚三种循环的格式和执行顺序,将每种循环的流程图理解透彻后就会明白如何替换使用。

dff4a893397278ebc791558f46847206.png

三、写代码练习

要想学好一门编程语言,看书远远不够,一定要把书里的代码搬到电脑里。只有边学边用、理论实践相结合,才能对知识真正掌握牢靠。虽说这都是老生常谈的话题了,但不可否认的是给你一部手机去探索它的功能远比只给你一本手机说明书要好得多。这里强调一点,一定要动手去敲代码,并且要勇于面对自己程序中的bug,只有找到程序中的问题,然后思考解决问题,在这个过程中你才能有所进步。c语言的学习一定是要在找bug中成长的。

d565cbb9d48913614e21b8b8b456e3e2.png dff4a893397278ebc791558f46847206.png

当我们把握好上述几方面后,只要大家能克服畏难、厌学、课前认真预习,上课能专心听讲,找到适合自己的学习方法,做好练习与上机调试,其实C语言并不难学。

9fa0c5d4927d7129e59fcb5c08a19337.png

扫码关注我们

供稿:网科部 吴瑕

排版:网科部 文晨昕

审核:网科部 吴 瑕

复审:学工办 黄丽芳

好的,以下是01背包问题的分支限界算法C语言实现: ```c #include <stdio.h> #include <stdlib.h> #define MAX_N 100 // 最大物品数量 #define MAX_W 1000 // 最大背包容量 int n, W; // 物品数量和背包容量 int v[MAX_N], w[MAX_N]; // 物品的价值和重量 int max_v = 0; // 最大价值 int best[MAX_N]; // 最优解 typedef struct Node { int level; // 当前节点所在层数 int value; // 当前价值 int weight; // 当前重量 int bound; // 当前上界 } Node; Node q[MAX_N]; // 优先队列 int head = 0, tail = 0; // 队列头和尾 // 比较函数,用于优先队列中的节点排序 int cmp(const void *a, const void *b) { Node *p = (Node *) a; Node *q = (Node *) b; return q->bound - p->bound; } // 计算节点的上界 int calc_bound(Node node) { int value = node.value; int weight = node.weight; int level = node.level; while (level < n && weight + w[level] <= W) { value += v[level]; weight += w[level]; level++; } if (level < n) { value += (W - weight) * v[level] / w[level]; } return value; } // 分支限界算法 void branch_and_bound() { Node u, v; u.level = 0; u.value = 0; u.weight = 0; u.bound = calc_bound(u); q[tail++] = u; while (head != tail) { u = q[head++]; if (u.bound > max_v) { v.level = u.level + 1; v.value = u.value + v[u.level]; v.weight = u.weight + w[u.level]; if (v.weight <= W && v.value > max_v) { max_v = v.value; for (int i = 0; i < v.level; i++) { best[i] = 0; } best[v.level - 1] = 1; } v.bound = calc_bound(v); if (v.bound > max_v) { q[tail++] = v; } v.value = u.value; v.weight = u.weight; v.bound = calc_bound(v); if (v.bound > max_v) { q[tail++] = v; } } } } int main() { printf("请输入物品数量和背包容量:"); scanf("%d%d", &n, &W); printf("请输入每个物品的价值和重量:\n"); for (int i = 0; i < n; i++) { scanf("%d%d", &v[i], &w[i]); } branch_and_bound(); printf("最大价值为:%d\n", max_v); printf("最优解为:\n"); for (int i = 0; i < n; i++) { if (best[i]) { printf("%d ", i); } } printf("\n"); return 0; } ``` 该算法的时间复杂度为 $O(2^n)$,但由于使用了优先队列,实际运行时间会比较快。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值