题意:
给n个物品,K个箱子,每个物品有体积Vi,要求最多能使用K个箱子(每个箱子的容积都要一样),需要的箱子的最小容积为多少
(注意不能跑背包,要根据题目所描述的每次放入最适合的最大的即可.......)?
思路:用multiset()来把每个物品存进去,这样的话里面的每个物品都是从小到大 排序好的,并且不会去重复,然后暴力枚举箱子的容积x,每次check一下若是可以用k个以内的箱子把所有的物品放进去那么就输出答案即可,check的方法是二分来查找于当前的箱子的剩余的容积最接近的放进去即可
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<set>
#define maxn 1010
using namespace std;
int n,k,a[maxn];
bool check(int x)
{
multiset<int>s;
int i;
for(i=0;i<n;i++)
{
s.insert(a[i]);
}
for(i=0;i<k;i++)
{
int res=x;
while(!s.empty())
{
multiset<int>::iterator it=s.upper_bound(res);
if(it==s.begin())
{
break;
}
it--;
res-=*it;
//printf("%d\n",*it);
s.erase(it);
}
}
if(s.empty())return true;
return false;
}
int main(int argc, char *argv[])
{
int t,ca=1;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&k);
int i;
int max1=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
max1+=a[i];
}
for(i=max1/k-1;;i++)
{
if(check(i))
{
printf("Case #%d: %d\n",ca++,i);
break;
}
}
}
return 0;
}