ECNUOJ 2142 放书
放书
Time Limit:1000MS Memory Limit:65536KB
Total Submit:409 Accepted:173
Description
你要把一叠书放进一些箱子里面,为了节约箱子,你要放尽量多的书到一个箱子里面,但不能超过箱子的重量限制。
当你把尽量多的书放进一个箱子以后,你把箱子关上,然后用下一个箱子去装书。为了避免麻烦,你只按书堆叠的从上到下的顺序把书放进箱子,也就是说在下面的书不会比上面的书先放进箱子。
从上到下给你每本书的重量和箱子的能承受的重量,你能求出需要多少个箱子吗?
Input
第一行是一个整数T,表示有T组测试数据。
每组测试数据的第一行是两个整数n(0<=n<=50),k(1<=k<=1000),表示有n本书,每个箱子的载重上限是k。
接下来一行有n个整数,表示n本书的重量,从上到下。这n个整数都大于等于1且小于等于k。
Output
对于每组测试数据,输出需要箱子的个数,占一行。
Sample Input
2
6 10
5 5 5 5 5 5
11 12
12 1 11 2 10 3 4 5 6 6 1
Sample Output
3
6
Source
解题:一道dp,dp[i]表示从i开始到最后最小需要几个箱子
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 100; 4 int d[maxn],dp[maxn]; 5 int main(){ 6 int kase,n,m; 7 scanf("%d",&kase); 8 while(kase--){ 9 scanf("%d%d",&n,&m); 10 for(int i = 0; i < n; ++i){ 11 scanf("%d",d+i); 12 } 13 int ret = 0; 14 memset(dp,0x3f,sizeof dp); 15 dp[n] = 0; 16 for(int i = n-1; i >= 0; --i){ 17 int sum = 0; 18 for(int j = i; j < n; ++j){ 19 sum += d[j]; 20 if(sum > m) break; 21 dp[i] = min(dp[i],dp[j+1] + 1); 22 } 23 } 24 printf("%d\n",dp[0]); 25 } 26 return 0; 27 }
夜空中最亮的星,照亮我前行