#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;
}