#include <stdio.h>
#include <malloc.h>
typedef struct ele //用来保存容器存入的数字编号
{
int vno;
struct ele *link;
}ELE;
typedef struct hnode //用来保存容器的情况
{
int remainder;
ELE *head;
struct hnode *next;
} HNODE;
void main()
{
int n, i, box_count, box_volume, *a;
HNODE *box_h, *box_t, *j;
ELE *p, *q;
// 输入信息
printf("输入容器容量: ");
scanf("%d", &box_volume);
printf("输入数字个数: ");
scanf("%d", &n);
a = (int *)malloc(sizeof(int)*n);
i = 0;
printf("请各数字: ");
while(i < n) scanf("%d", (a + i++));
// 贪婪法处理过程,贪婪法不是最优的,但是最快的
box_h = box_t = NULL;
box_count = 0;
for(i = 0; i < n; i++)
{
p = (ELE *)malloc(sizeof(ELE));
p->vno = i;
for(j = box_h; j != NULL; j = j->next) if (j->remainder >= a[i]) break; // 找合适的箱子
if (j == NULL) // 没有找到合适的
{
j = (HNODE *)malloc(sizeof(HNODE)); // 新增一个箱子
j->remainder = box_volume - a[i];
j->head = NULL;
if (box_h == NULL) box_h = box_t = j; // 第一个箱子
else box_t = box_t->next = j;
j->next = NULL;
box_count++;
}
else j->remainder -= a[i]; // 找到后,将剩余空间减去
for (q = j->head; q != NULL && q->link != NULL; q = q->link); //保存物品编号
if (q == NULL)
{
p->link = j->head;
j->head = p;
}
else
{
p->link = NULL;
q->link = p;
}
}
// 输出结果
printf("共使用了%d只容器", box_count);
printf("各容器装数字情况如下:\n");
for (j = box_h, i = 1; j != NULL; j = j->next, i++)
{
printf("第%2d只容器,还剩余容量%4d,所装数字编号有:\n\t", i, j->remainder);
for (p = j->head; p != NULL; p = p->link) printf("%4d", p->vno + 1);
printf("\n");
}
}
追问请问能帮忙优化一下吗,万分谢谢了
所装数字应该显示的是每个数值啊,余量应该是6000减去这些数值的结果啊,还有,余量不可能是负值的啊
追答长度超出了,上传个附件,内容在附件中
追问输入这行数值后按回车怎么老是闪退 啊
能加上你聊吗谢谢了
追答我自己调试过,没有闪退的现象呀
追问我用了60个数据啊,已经私信你了,请你看一下,一般用的数据都比较多的,几百个数据也是有可能的
追答手工输入没有试过,试过随机产生几百个数据的
追问总容量6000, 个数6 ,5800 600 400 2800 3500 1000,就闪退了
追答 // 删除动态分配的内存
delS(type);
delS(type+1);
free(a);
system("pause");//加上这句
追问我先采纳你了,我们私信聊好吗,谢谢你了
追答最优解需要动态规划,这个还不熟悉,不好意思
本回答被提问者采纳