奔奔熊搬家包装物品
叙述性说明:
笨笨熊在森林中也能得到幸福的今天,朋友——他买了新房子,若要将搬迁到新喜。故。请承受了很大的笨笨的朋友帮忙搬家,并准备非常需要移动用来装物品小托盘,只要,这些纸箱都是同一个卷,而且最多可容纳只有两篇文章。但,的朋友,笨笨熊想了个“聪明”办法:让每一个纸盒使用效率最高(注:仅仅要纸盒容积大于物品的体积之和就觉得能够装下。物品体积不会大于纸盒容积),这样须要的纸盒最少。
叙述性说明:
笨笨熊在森林中也能得到幸福的今天,朋友——他买了新房子,若要将搬迁到新喜。故。请承受了很大的笨笨的朋友帮忙搬家,并准备非常需要移动用来装物品小托盘,只要,这些纸箱都是同一个卷,而且最多可容纳只有两篇文章。但,的朋友,笨笨熊想了个“聪明”办法:让每一个纸盒使用效率最高(注:仅仅要纸盒容积大于物品的体积之和就觉得能够装下。物品体积不会大于纸盒容积),这样须要的纸盒最少。
为了帮助笨笨熊提前通知朋友。请你依据笨笨熊的办法。帮忙算出:须要纸盒的最少数目是多少?
执行时间限制: 无限制
内存限制: 无限制
输入:
整数V——纸盒的容积。
整数N——物品的总数目N;
共N个整数(相应N个物品的体积,每一个整数用空格隔开)。
输出:
整数M——须要纸盒的最少数目;
例子输入:
10
2
2 3
例子输出:
1
我的想法是现将输入的物体体积按从大到小排序(也能够从小到大),然后最大的与最小的体积和不超过容积的话则这两个一起放在一个盒子里,否则最大的那个单独放在一个盒子里。
假设最后剩余一个则单独放置。每放一次盒子数加1。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool order(int a,int b);
int main(){
int v,n,m=0,input,first,last;
vector<int> obj;
cout << "纸盒的容积V:";
cin >> v;
cout << "物品的总数目N:";
cin >> n;
cout << "这N个物品的体积各自是:";
for(int i=0;i!=n;i++)
{
cin >> input;
obj.push_back(input);
}
// cout << "输入的是:";
//
// for(i=0;i!=n;i++)
// {
//
// cout <<obj[i]<<" ";
// }
// cout <<endl;
sort(obj.begin(),obj.end(),order); //降序排列obj中的元素。
//
// cout << "排序后:" ;
// for(int so=0;so!=obj.size();so++) cout << obj[so]<<" ";
// cout <<endl;
first=0; //较大的物品
last=obj.size()-1; //较小的物品
if(obj[first]>v)
{
cout <<"ERROR:输入的数超过容器容积"<<endl;
return 1;
}
if(n==1) m=1; //仅仅有一个物品。
while(first<last)
{
if(obj[first]+obj[last]<v+1) //较大的物品与较小的物品放在一起。
{
m++;
first++;
last--;
}
else {m++;first++;} //较大的物品单独放。
if(first==last) m++; //最后剩余一个单独放
}
cout << "至少须要" << m<<"个容器" << endl;
return 0;
}
bool order(int a,int b)
{
return a>b; //降序排列
}
版权声明:本文博主原创文章。博客,未经同意不得转载。