C语言:贪心算法之装箱问题
- #include <stdio.h>
- #include <stdlib.h>
- #define N 6
- #define V 100
- typedef struct box // 使用 typedef 来为用户自定义的数据类型box取一个新的名字BOX
- {
- int no;
- int size;
- struct box* next;
- }BOX;
- // 使用访问结构的指针访问结构的成员
- void init_list(BOX** H) // 声明了一个指向 BOX 类型指针的指针 *H为一级指针,&(*H)为一级指针的地址,即将一级指针的地址赋值给二级指针H
- *H = (BOX*)malloc(sizeof(BOX)); // H表示一级指针的地址,*H表示一级指针的值,**H表示普通变量的值,由于一级指针指向结构体BOX,故可以通过一级指针访问结构的成员
- (*H)->no = 0;
- (*H)->size = 0;
- (*H)->next = NULL;
- }
- BOX* find_p(BOX* H, int volume, int v)
- {
- BOX* p = H->next; // 一开始,由于H->next为NULL,故p为空指针.第二轮,由于H->next不为空,故将p指针指向H->next指针指向的对象即(1,60,NULL)
- while(p!=NULL)
- {
- if(p->size+volume <= v) // 60+45>100,不执行
- break;
- p = p->next; //第二轮,p=NULL
- }
- return p;
- }
- //让q指针指向H指针指向的对象,通过q指针访问H指针指向的对象的成员,由于H指针指向对象的成员也是一个BOX类型的指针,然后让H指针指向对象的成员next指向p指针指向的对象(1,60,NULL)
- void add_list_tail(BOX* H, BOX* p) // H,p均为一级指针,H指针指向(0,0,NULL),p指针指向(1,60,NULL)
- {
- BOX* tmp = H->next; // H->next为NULL,此时tmp为空指针
- BOX* q = H; // q指针指向H指针指向的对象
- while(tmp!=NULL)
- {
- q = tmp;
- tmp = tmp->next;
- }
- q->next = p; //q为一级指针,q->next表示结构体的成员,即一级指针指向p指针指向的对象,此时两个对象相连
- }
- void print_list(BOX* H)
- {
- BOX* p = H->next;
- while(p!=NULL)
- {
- printf("%d:%d\n", p->no, p->size);
- p = p->next;
- }
- }
- int add_box(int volume[], int v)
- {
- int count = 0;
- int i;
- BOX* H = NULL; //定义一个Box型的指针,指针的值为NULL,即空指针
- init_list(&H);
- for(i=0;i<N;i++)
- {
- BOX* p = find_p(H, volume[i], v); // 一级指针p指向结构体
- if(p==NULL)
- {
- count++;
- p = (BOX*)malloc(sizeof(BOX));
- p->no = count; // 通过一级指针给结构体成员赋值 1
- p->size = volume[i]; // 60
- p->next = NULL; //NULL,此时p指针指向(1,60,NULL)结构体,H指针指向(0,0,NULL)
- add_list_tail(H, p); //此时H指向的对象的成员next指向p指针指向的成员
- }
- else
- {
- p->size += volume[i]; //第二轮,将两个数相加
- }
- }
- print_list(H);
- return count;
- }
- int main(int argc, char *argv[])
- {
- int ret;
- int volumes[] = {60, 45, 35, 20, 20, 20};
- ret = add_box(volumes, V);
- printf("%d\n", ret);
- system("PAUSE");
- return 0;
- }
装箱问题注意事项:
1、n中物品要从大到小排号序。
2、先装大的,再从大到小装小的,两个数相加不大于100即可。
3、每只箱子所装物品用链表来表示,
C语言:贪心算法之装箱问题的更多相关文章
- C语言 · 贪心算法
发现蓝桥杯上好多题目涉及到贪心,决定学一学. 贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择.也就是说:不从整体最优上考虑,而是在某种意义上的局部最优解.其关键是贪心策略的选择,选择的贪心 ...
- C语言词法分析中的贪心算法
C语言词法分析中的贪心算法 当我们写出a---b这种语句的时候我们应该考虑C语言的编译器是如何去分析这条语句的. C语言对于解决这个问题的解决方案可以归纳为一个很简单的规则:每一个符号应该包含尽可能多 ...
- #C++初学记录(贪心算法#结构体#贪心算法)
贪心算法#结构体 Problem Description "今年暑假不AC?" "是的." "那你干什么呢?" "看世界杯呀,笨蛋 ...
- 组合优化学习笔记<之>从贪心算法到子集系统再到拟阵
贪心算法是用的比较多的一种优化算法,因为它过程简洁优美,而且结果有效.有些优化问题如最大权森林(MWF)是可以用贪心问题求解的,由于最小支撑树(MST)问题与MWF是等价的,所以MST也是可以用贪心算 ...
- [C++]单源最短路径:迪杰斯特拉(Dijkstra)算法(贪心算法)
1 Dijkstra算法 1.1 算法基本信息 解决问题/提出背景 单源最短路径(在带权有向图中,求从某顶点到其余各顶点的最短路径) 算法思想 贪心算法 按路径长度递增的次序,依次产生最短路径的算法 ...
- [C++]多源最短路径(带权有向图):【Floyd算法(动态规划法)】 VS n*Dijkstra算法(贪心算法)
1 Floyd算法 1.1 解决问题/提出背景 多源最短路径(带权有向图中,求每一对顶点之间的最短路径) 方案一:弗洛伊德(Floyd算法)算法 算法思想:动态规划法 时间复杂度:O(n^3) 形式上 ...
- [C++]哈夫曼树(最优满二叉树) / 哈夫曼编码(贪心算法)
一 哈夫曼树 1.1 基本概念 算法思想 贪心算法(以局部最优,谋求全局最优) 适用范围 1 [(约束)可行]:它必须满足问题的约束 2 [局部最优]它是当前步骤中所有可行选择中最佳的局部选择 3 [ ...
- 贪心算法(Greedy Algorithm)
参考: 五大常用算法之三:贪心算法 算法系列:贪心算法 贪心算法详解 从零开始学贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以 ...
- 算法导论----贪心算法,删除k个数,使剩下的数字最小
先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4, ...
随机推荐
- Python基础随笔①(MOOC)
@ 目录 前言 概述 主体 1.基本语法元素 ①实例:温度转换 要求 分析 代码部分 运行结果 ②作业:Hello World的条件输出 要求 分析 代码 运行结果 ③作业:数值运算 要求 分析 代码 ...
- 从零开始教你安装Oracle数据库
1.数据库安装 1.1下载 根据自己的操作系统位数,到oracle官网下载(以oracle 11g 为例) 之后把两个压缩包解压到同一个文件夹内(需要注意的是,这个文件夹路径名称中最好不要出现中文.空 ...
- C - Door Man(欧拉回路_格式控制)
现在你是一个豪宅的管家,因为你有个粗心的主人,所以需要你来帮忙管理,输入会告诉你现在一共有多少个房间,然后会告诉你从哪个房间出发,你的任务就是从出发的房间通过各个房间之间的通道,来把所有的门都关上,然 ...
- LVS-DR 模式
SNAT(Source Network Address Translation)源地址转换,类似家里路由器设置,内网地址向外访问时,发起访问的内网ip地址转换为指定的 IP 地址 DNAT(Desti ...
- kubernetes进阶(一) kubectl工具使用详解
管理k8s核心资源的三种基本方法: 一.陈述式-主要依赖命令行工具 --可以满足90%以上的使用场景,但是缺点也很明显: 命令冗长,复杂,难以记忆 特定场景下,无法实现管理需求 对资源的增.删.查操 ...
- 鸟哥的linux私房菜——第四章学习
******************第四章学习****************** [热键] 1.Tab键:命令补全:文件补全: 2.Ctrl+c:中断目前指令: 3.Ctrl+d:离开当前文本界面: ...
- HDU 4675 GCD of Sequence(莫比乌斯反演 + 打表注意事项)题解
题意: 给出\(M\)和\(a数组\),询问每一个\(d\in[1,M]\),有多少组数组满足:正好修改\(k\)个\(a\)数组里的数使得和原来不同,并且要\(\leq M\),并且\(gcd(a_ ...
- HDU 3065 病毒侵袭持续中(AC自动机 模板)题解
题意:给出主串中每个模式串的个数 思路:毒瘤出题人多组数据没说给的是多组数据. 板子: struct Aho{ struct state{ int next[130]; int fail, cnt; ...
- PicGo:搭建图床
PicGo:搭建图床 PicGo 免费搭建个人图床工具PicGo: 支持Windows.MacOS 和 Linux 软件目前覆盖的图床有8个平台: SM.MS图床.腾讯云COS.GitHub图床.七牛 ...
- C++中函数的形式参数引用
形式参数的传递方式 值传递 值传递是将数值传递到程序中,这种方式传递是单向传递 但是如果想要双向传递,这种视频无法满足: 引用传递 引用传递可以实现双向的传递 为了对比处两个之间的差异,这里举出两个例 ...