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开始到最后最小需要几个箱子

 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
",dp[0]);
25     }
26     return 0;
27 }
View Code
原文地址:https://www.cnblogs.com/crackpotisback/p/4639070.html