华为编程大赛 每日一练(二)

本文介绍了一个具体的物品装箱问题解决方法,通过编程实现了物品体积排序及最优装箱过程。该算法首先对物品体积进行从大到小排序,然后依次尝试将体积大的物品装入盒子,并检查是否还有其他物品能一起放入同一盒子中,以此来减少所需的盒子数量。
摘要由CSDN通过智能技术生成







#include <stdio.h>
#include <stdlib.h>
//编程思想是将输入的所有物品的体积进行排序,然后最大的开始放(同时在下一个盒子剔除掉这个盒子),并且遍历后面的有
//没有还能放进去的,能盒子数量减一,并且想办法剔除这个盒子和最大的那个盒子,进行下一个盒子放物品。
int main(int argc, char **argv)
{
	int num_V,i,j,k,temp;
	int num_N,num_box=0;
	unsigned int *Vpoint,*p;
	printf("请输入盒子容积:\n");
	scanf("%d",&num_V);
	printf("请输入物品数量:\n");
	scanf("%d",&num_N);
	Vpoint=(unsigned int *)malloc(sizeof(unsigned int)*num_N);//果分配成功则返回指向被分配内存的指针
	p=Vpoint;                                  //(此存储区中的初始值不确定),否则返回空指针NULL
	printf("请输入各物品体积:\n");
	for(i=0;i<num_N;i++,p++)    //值得学习的地方,前面用malloc开辟一定大小的空间,并且给出指针
	{                    //这里可以用来存值,而且是动态的的存值,你输入多少,我这边存多少i++,p++
		scanf("%d",p);
		if (*p>num_V)
		{
			printf("物品体积大于盒子体积,不合法\n");
			exit(0);
		}
	}
	
	/******test*****/
	//for(p=Vpoint,i=0;i<num_N;i++,p++)
	//printf("%d\n",*p);

	printf("*********\n");
	/***sort***/                     //排序的思想很好,从大到小
	for (i=0;i<num_N-1;i++)
	{
		for(j=0;j<(num_N-1-i);j++)
			if(Vpoint[j]<Vpoint[j+1])
			{
				temp=Vpoint[j];
				Vpoint[j]=Vpoint[j+1];
				Vpoint[j+1]=temp;
			}
	}	
	/******test*****/
	//for(p=Vpoint,i=0;i<num_N;i++,p++)
	//printf("%d\n",*p);

	num_box=num_N;
	for(i=0;i<num_N;i++)
	{
		temp=num_V-Vpoint[i];
		Vpoint[i]=num_V;             //这次为下面的if语句剔除放进去的物品
		for (j=i+1;j<num_N;j++)
		{
			if (Vpoint[j]<temp)        //是小于,不是小于等于,这里要求之和小于体积,不能等于
			{                          //记住只能放两个最多
				//temp=temp-Vpoint[j]   //如果没有限制只能放两个的话不用注释这句
				Vpoint[j]=num_V;      //一旦加入了另外一个物品,将这个地址栏赋值为盒子总题集,				                        
				num_box--;           //在下次if判断时候剔除这个地址栏
			}
		}	
	}
			
	printf("最小的箱子数为:%d\n",num_box);

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值