求c,c++高手帮忙解决一道题,谢谢了

这道题我以其他形式描述过,有高手帮我解决了,但是总感觉不是最佳方案,所以重新问一下,求高手帮忙解决了,把以前高手做出来的做下优化也行,谢谢了。下面是题有n个数,这些数全部... 这道题我以其他形式描述过,有高手帮我解决了,但是总感觉不是最佳方案,所以重新问一下,求高手帮忙解决了,把以前高手做出来的做下优化也行,谢谢了。下面是题
有n个数,这些数全部都是大于0小于6000的数,现在把这些数当成体积块,往6000大小里的容器里放,把容器放满不能再放为止,看最少用多少个6000大小的容器,这里有一个容器里放的体积块可以是任意,其他一定要最大,容器数一定要最少,可以输入一组数验证一下,求高手帮忙给写个,谢谢了
展开
 我来答
478617
2014-08-02 · TA获得超过875个赞
知道小有建树答主
回答量:725
采纳率:100%
帮助的人:82.3万
展开全部
#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减去这些数值的结果啊,还有,余量不可能是负值的啊

追答

长度超出了,上传个附件,内容在附件中


本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
双鱼LiSung
2014-08-01
知道答主
回答量:29
采纳率:0%
帮助的人:20.6万
展开全部
贪心算法求最优解。很遗憾帮不到你。
追问
要尝试一下吗,我可以把原来的描述和高手做的答案发给你,试试吧
追答
不了,对于算法我接触的比较少,如果已经有了完整的思路,我倒是可以把他实现。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lhr950627
2014-08-01 · TA获得超过337个赞
知道小有建树答主
回答量:159
采纳率:100%
帮助的人:109万
展开全部
“这里有一个容器里放的体积块可以是任意,其他一定要最大”这句啥意思啊?
更多追问追答
追问
一个容器可以不用放满,别的必须放满啊,要求用的容器数最少
追答
...那堆数代表的体积块是可以拆开放……?
那把所有数加起来除以6000向上取证不就完了……?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式