(c语言版)装箱问题

假设有N项物品,大小分别为s​1​​、s​2​​、…、s​i​​、…、s​N​​,其中s​i​​为满足1≤s​i​​≤100的整数。要把这些物品装入到容量为100的一批箱子(序号1-N)中。
装箱方法是:对每项物品, 顺序扫描箱子,把该物品放入足以能够容下它的第一个箱子中。请写一个程序模拟这种装箱过程,并输出每个物品所在的箱子序号,以及放置全部物品所需的箱子数目。
输入格式:
输入第一行给出物品个数N(≤1000);第二行给出N个正整数s​i(1≤s​i​​≤100,表示第i项物品的大小)。
输出格式:
按照输入顺序输出每个物品的大小及其所在的箱子序号,每个物品占1行,最后一行输出所需的箱子数目。
输入样例:
8
60 70 80 90 30 40 10 20
输出样例:
60 1
70 2
80 3
90 4
30 1
40 5
10 1
20 2
5

#include<stdio.h>
#include<stdlib.h>
typedef struct A {
	int Vol;//箱子的大小
	int arr;//箱子的序号
	struct A *next;
}Node;      //一个箱子

void Attach(int a, int b, Node**tail) {
	Node*P;
	P = (Node*)malloc(sizeof(struct A));
	P->Vol = a;
	P->arr = b;
	P->next = NULL;
	(*tail)->next = P;
	(*tail) = P;
}       //连接两个链表

int main() {
	int a;
	int *b;         //储存输入的数
	int c = 100;    //箱子初始大小100
	int d = 1;      //箱子的序号1
	Node*Head;//指向链表开头
	Node*n;         //用于遍历所有箱子
	Head = (Node*)malloc(sizeof(struct A));
	Node* tail;     //指向最后一个链表,用于连接链表
	Head->next = NULL;
	tail = Head;
	scanf("%d", &a);  //读入输入的个数
	b = (int*)malloc(a * sizeof(int));//创建数组大小
	for (int i = 0; i < a; i++) {
		scanf("%d", &b[i]);
	}     //数组读入
	Attach(c, d, &tail);//Head后先创建第一个箱子
	Head = Head->next;//使Head指向第一个箱子,对了这里还要free掉原来的Head,偷了点小懒,不过这里也无所谓
	n = Head;
	for (int i = 0; i < a; i++) {      //循环遍历输入的数
		while (n) {//当n等于NULL结束
			if (b[i] <= n->Vol) {      //判断输入的数和箱子的容量
				n->Vol = n->Vol - b[i];    //箱子的剩余容量
				printf("%d %d\n", b[i], n->arr); 输出
					break;            //当输出一个组后结束循环,进入下一轮外循环
			}
			else if (b[i] > n->Vol&&n->next == NULL) {	   //如果物品的体积大于箱子的容量并且这是最后一个箱子		
				d++;    //箱子+1
				Attach(c, d, &tail);	//创建一个新的箱子				
			}
			n = n->next;  //遍历所有箱子
		}
		n = Head;  //使每一轮读入的数都从第一个箱子开始判断
	}
	printf("%d", d);
	return 0;
}

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
装箱问题是指将若干个物品放入容量相同的箱子中,在保证物品不受损坏的情况下,使箱子的数量最少。 用数组实现装箱问题的思路是先将物品按照体积从大到小排序,然后依次将物品放入当前剩余体积最大的箱子中,直到所有物品都被放入箱子为止。 以下是用C语言实现的代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_ITEM_NUM 100 #define MAX_BOX_VOLUME 10 int cmp(const void *a, const void *b) { return *(int *)b - *(int *)a; } int main() { int item_num, item[MAX_ITEM_NUM], box_num = 0, box[MAX_ITEM_NUM], i, j; int box_volume = MAX_BOX_VOLUME; printf("请输入物品数量:"); scanf("%d", &item_num); for (i = 0; i < item_num; i++) { printf("请输入第%d个物品的体积:", i+1); scanf("%d", &item[i]); } qsort(item, item_num, sizeof(int), cmp); for (i = 0; i < item_num; i++) { for (j = 0; j < box_num; j++) { if (box[j] >= item[i]) { box[j] -= item[i]; break; } } if (j == box_num) { box[box_num++] = box_volume - item[i]; } } printf("最少需要%d个箱子\n", box_num); return 0; } ``` 首先,我们定义了常量`MAX_ITEM_NUM`表示最大物品数量,`MAX_BOX_VOLUME`表示每个箱子的容量大小。 然后,我们定义了一个`cmp`函数,用于将物品按照体积从大到小排序。这里使用了C语言标准库中的`qsort`函数。 接着,我们定义了变量`item_num`表示物品数量,`item`表示每个物品的体积,`box_num`表示箱子数量,`box`表示每个箱子当前的剩余体积。变量`i`和`j`用于循环计数。 在主函数中,我们先输入物品数量和每个物品的体积,并调用`qsort`函数将物品按照体积从大到小排序。 然后,我们依次将物品放入箱子中。对于每个物品,我们在已有的箱子中找到剩余体积最大的箱子,若该箱子能够容纳该物品,则将该物品放入该箱子中;否则,开启一个新的箱子,并将该物品放入该箱子中。 最后,我们输出最少需要的箱子数量。 注意,这里的代码仅实现了最基本的装箱功能,没有考虑物品数量超过箱子数量的情况,也没有考虑物品体积超过箱子容量的情况。实际应用中需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值