描述
假设有N项物品,大小分别为s1 、s2 、…、si 、…、sN ,其中si 为满足1≤si ≤100的整数。要把这些物品装入到容量为100的一批箱子(序号1-N)中。装箱方法是:对每项物品, 顺序扫描箱子,把该物品放入足以能够容下它的第一个箱子中。请写一个程序模拟这种装箱过程,并输出每个物品所在的箱子序号,以及放置全部物品所需的箱子数目。
输入
输入第一行给出物品个数N(≤1000);第二行给出N个正整数si(1≤si≤100,表示第i项物品的大小)。
输出
按照输入顺序输出每个物品的大小及其所在的箱子序号,每个物品占1行,最后一行输出所需的箱子数目。
输入输出示例
输入 | 输出 | |
示例 1 | | |
#include<stdio.h>
//m为箱子实际计数,arr1[]为物品的重量,arr2[]为箱子的实际重量
//arr2={0}重量都为0 ,m初始化值也为0;
int main()
{
int arr1[20],arr2[20]={0},i,j,m,n;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&arr1[i]);//存入重量于物品中
m=0;
for(i=0;i<n;i++)//第i件物品装箱
{
for(j=0;j<n;j++)//每个箱子都要试着装载一下
{
if(arr1[i]<100-arr2[j])//判断是否箱子能够容纳物品
{
arr2[j]=arr1[i]+arr2[j];//更新第j个箱子已经装载物品的重量
printf("%d %d\n",arr1[i],j+1);
if(j+1>m) //这一步作用在于把计数出具体要使用箱子是个数,为什么要j+1>m呢?
//因为j+1是从0开始依次判断的,当物品判断到前面j+1<m的箱子时,
// 不能使m++,m为实际需要用到的箱子数
//每次物品放入箱子后,不用再进行j++,选取下一个箱子存放当前的物品,
m++;break; //此时应该结束循环,从下一个物品开始选取与第一个箱子判断
}//第i件物品已经装载完毕,循环(j变量控制)强制结束
}
}
printf("%d",m);//下面几张图片是我自己在电脑是用心画的,便以大家理解,是对应我的代码的具体过程
}
1以下为老师上课的笔记我截屏保存了,还有老师提供标准答案的代码
#include <stdio.h>
#define N 1000
int main() {
int s[N] = {60, 70, 80, 90, 30, 40, 10, 20}; /* 每件物品重量 */
int b[N] = {0}; /* 每个箱子中已经装载物品的重量,缺省为空(重量为 0) */
int n = 8, i, j, m; /* m -- 所需箱子总数 */
/* Input*/
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &s[i]);
/* Calculate */
m = 0;
for (i = 0; i < n; i++) {
/* 第i件物品装箱*/
for (j = 0; j < n; j++) { /* 每个箱子都要试着装载一下 */
/* 判断第i件物品是否可以在第j个箱子中装载? */
if (s[i] <= 100 - b[j]) {
printf("%d %d\n", s[i], j + 1);
b[j] = b[j] + s[i]; /* 更新第j个箱子已经装载物品的重量 */
/* 更新所需箱子总数 */
if (j + 1 > m)
m++;
/* 第i件物品已经装载完毕,循环(j变量控制)强制结束 */
break;
}
}
}
/* Output */
printf("%d\n", m);
return 0;
}