您的位置:首页 > 编程语言 > C语言/C++

笨笨熊搬家打包篇

2014-04-30 00:55 162 查看
 笨笨熊搬家打包篇

描述:

森林里的笨笨熊今天可开心啦——他买了新房子,乔迁新喜要搬家了。因此,笨笨熊请了许多好朋友来帮忙搬家,并准备了很多小纸盒用来装需要搬的物品,不过,这些纸盒的容积都是相同的,并且最多只能装两个物品。但是,为了不打扰太多的朋友,笨笨熊想了个“聪明”办法:让每个纸盒使用效率最高(注:只要纸盒容积大于物品的体积之和就认为可以装下;物品体积不会大于纸盒容积),这样需要的纸盒最少。为了帮助笨笨熊提前通知朋友,请你根据笨笨熊的办法,帮忙算出:需要纸盒的最少数目是多少?   

 

 

运行时间限制: 无限制

内存限制: 无限制

输入:

整数V——纸盒的容积;

整数N——物品的总数目N;

共N个整数(对应N个物品的体积,每个整数用空格隔开)。

 

输出:

整数M——需要纸盒的最少数目;    

    

样例输入:

10



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; //降序排列
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 华为 编程