蚂蚁的难题(八)

来源:互联网 发布:c 五子棋源码 编辑:程序博客网 时间:2024/05/04 19:39

蚂蚁的难题(八)

时间限制: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 102 33 44 7
样例输出
9
#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>using namespace std;struct node{    int a,b;} we[1010];int dp[10010];bool cmp(node s,node w){    return s.b-s.a>w.b-w.a;//先将放时占用位置较大的先放上}int main(){    int n,l;    while(scanf("%d%d",&n,&l)!=-1)    {        for(int i=0; i<n; i++)        {            scanf("%d%d",&we[i].a,&we[i].b);        }        memset(dp,0,sizeof(dp));        sort(we,we+n,cmp);        int maxn=0;        for(int i=0; i<n; i++)        {            for(int j=l; j>=we[i].a; j--)            {                if(l-j>=we[i].b-we[i].a)//判断是否能放                {                    dp[j]=max(dp[j],dp[j-we[i].a]+we[i].a);                    maxn=max(maxn,dp[j]);                }            }        }        printf("%d\n",maxn);    }}

0 0
原创粉丝点击