蚂蚁的难题(八)
时间限制:
2000 ms | 内存限制:
65535 KB
难度:
5
-
描述
-
蚂蚁是一个古玩爱好者,他收藏了很多瓶瓶罐罐。
有一天,他要将他的宝贝们一字排开, 摆放到一个长度为L的展台上。
已知他有n件宝贝, 每件宝贝的宽为w,由于这些瓶瓶罐罐的形状特殊,所以在摆放时需要至少X的宽度来摆放他们,(仅摆放时需要X的宽度, 摆放后宽度仍为w)现在已知了每件宝贝的宽度wi,和摆放它们所需的宽度Xi。请你帮蚂蚁计算一下,在这个展台上,他最多能摆多宽的宝贝。
-
输入
-
有多组测试数据。
对于每一组测试数据:
第一行: n L 分别代表有n件宝贝,展台长度为L;(n<1000, L<10000)
接下来有n行, 每行有两个整数 wi xi 分别代表第i件宝贝的宽度和摆放时需要的宽度。(0<wi <= xi < 10000).
输出
- 输出蚂蚁能够摆出的最大的宽度。 样例输入
-
3 10 2 3 3 4 4 7
样例输出
-
9
-
-
有多组测试数据。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node{
int w,x;
}A[1010];
int dp[10010];
bool cmp(Node a,Node b){//先将放时占用位置较大的先放上
return a.x-a.w>b.x-b.w;
}
int MAX(int a,int b){
return a>b?a:b;
}
int main()
{
int n,l,i,j,k;
while(scanf("%d%d",&n,&l)!=EOF){
for(i=0;i<n;++i){
scanf("%d%d",&A[i].w,&A[i].x);
}
sort(A,A+n,cmp);
memset(dp,0,sizeof(dp));
int ans=0;
for(i=0;i<n;++i){
for(j=l;j>=A[i].w;--j){
if(l-j>=A[i].x-A[i].w){//判断能否放下
dp[j]=MAX(dp[j],dp[j-A[i].w]+A[i].w);
ans=MAX(dp[j],ans);
}
}
}
printf("%d\n",ans);
}
return 0;
}