[题目大意]
n个物品及其体积,用k个相同的箱子装,求能装下这n个物品的箱子的最小容积。
对于一个箱子,每次都先装能装下的最大的物品,不能满足则开始装下一个箱子。
[思路]
ans = max ( vol [i] , ceil(sum ( vol [i]] ) / k )) ,while(ans++)直到能装下所有物品。
[代码]
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=1e3+3;
4 int arr[maxn];
5 int n,m;
6 int vol[maxn];
7 bool check(int now)
8 {
9 int num_box=0;
10 memset(vol,0,sizeof(vol));
11 for(int i=n; i>=1; i--)
12 {
13 bool flag=false;
14 for(int j=0; j<num_box; j++)
15 {
16 if(vol[j]+arr[i]<=now)
17 {
18 vol[j]+=arr[i];
19 flag=true;
20 break;
21 }
22 }
23 if(!flag)
24 {
25 vol[num_box]=arr[i];
26 num_box++;
27 }
28 if(num_box>m)return false;
29 }
30 return true;
31 }
32 int main()
33 {
34 int t;
35 scanf("%d",&t);
36 int k=1;
37 while(k<=t)
38 {
39 int ans=0;
40 int sum=0;
41 scanf("%d%d",&n,&m);
42 for(int i=1; i<=n; i++)
43 {
44 scanf("%d",&arr[i]);
45 sum+=arr[i];
46 ans=max(arr[i],ans);
47 }
48 ans=max(ans,sum/m);
49 sort(arr+1,arr+n+1);
50 while(!check(ans))
51 {
52 ans++;
53 }
54 printf("Case #%d: %d\n",k,ans);
55 k++;
56 }
57 return 0;
58 }
59 /*
60 3
61 3 2
62 6 6 7
63 5 3
64 1 2 3 4 5
65 */