2-9パッキング問題(20ポイント)
N個のアイテムがあり、サイズがs1、s2、…、si、…、s Nであると仮定します。ここで、siは1≤si≤100を満たします。は整数です。これらのアイテムは、容量100のボックスのバッチ(シリアル番号1-N)に梱包する必要があります。梱包方法は次のとおりです。アイテムごとに、ボックスを順番にスキャンし、アイテムを保持するのに十分な大きさの最初のボックスにアイテムを入れます。この梱包プロセスをシミュレートするプログラムを作成し、各アイテムが配置されているボックスのシリアル番号と、すべてのアイテムを配置するために必要なボックスの数を出力してください。
入力形式:
最初の行を入力してアイテム数N(≤1000)を指定し、2行目を入力してN個の正の整数s i(1≤si≤100、i番目のアイテムのサイズを示す)を指定します。
出力形式:
各項目のサイズと入力順に配置されているボックスのシリアル番号を出力します。各項目は1行を占め、最後の行は必要なボックスの数を出力します。
質問のアイデア:まず、アイテムの場所をアイテムの出力と同時に出力する必要があるため、2つの情報を格納するための構造体配列を定義します。次に、アイテムを格納する配列を作成し、配列初期化バケットを作成します。2つは足し算と引き算ができます。コードをアップロードします。
#include< iostream>
using namespace std;
const int SIZE = 10000;
typedef struct Box {
int size; //物品的大小
int number; //物品所存放的位置
};
int main()
{
int n, k = 0;
cin >> n;
int br[SIZE];
for (int i = 0; i < SIZE; i++) //先把每个桶的容量初始化
br[i] = 100;
Box box[SIZE]; //先定义存放物品的数组,方便后续进行操作
for (int i = 0; i < n; i++)
cin >> box[i].size; //输入物品的重量
for (int i = 0; i < n; i++) //遍历每一个物品
{
for (int j = 1; j < SIZE; j++) //桶下标从1开始,方便使用,当然用0也可以的,程序是活的
{
if (br[j] >= box[i].size) //如果桶的容量大于当前物品的重量
{
br[j] -= box[i].size; //把物品放进去,痛的容量减少
box[i].number = j; //物品放在了第j个桶里面
break; //进行了操作以后,break出来,不然这层for一直运行
}
}
}
for (int i = 1;i < SIZE; i++) //计算桶的数量
{
if (br[i] == 100)break;
k++;
}
for (int i = 0; i < n; i++)
cout << box[i].size << " " << box[i].number << endl;
cout << k;
return 0;
}