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\n",dp[0]);
25     }
26     return 0;
27 }
View Code

 

转载于:https://www.cnblogs.com/crackpotisback/p/4639070.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值