zoj 3077 Move to Baggage Office(离散化处理+背包dp)

来源:互联网 发布:知乎 江歌 贫困生 编辑:程序博客网 时间:2024/05/12 06:46

【题目大意】:一个人有能量s,现在有n件物品,每件物品有价值v,现在把这件物品要消耗能量x,搬完这件物品能回复能量y。问最多可以搬动多少物品。


【解题思路】:背包是明显的....但是也是明显错误的...因为我可能拿了A之后拿不了B,但是拿了B之后却可以拿A....所以需要用离散化来消除这种后效性...

                            不知道排哪个序啊...一个一个的试,然后试到了拿y从大到小排时AC了....-_-!!!!!!....

    其实因为题目有一个条件x>y。。我很愿意把它理解成每次我都是希望它恢复的能力越多越好...


【代码】:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <queue>#include <cmath>#include <string>#include <cctype>#include <map>#include <iomanip>                   using namespace std;                   #define eps 1e-8#define pi acos(-1.0)#define inf 1<<30#define linf 1LL<<60#define pb push_back#define lc(x) (x << 1)#define rc(x) (x << 1 | 1)#define lowbit(x) (x & (-x))#define ll long longstruct Node{    int v,x,y;}a[110];int dp[1100];int s,n;bool cmp(const Node &a,const Node &b){    return a.y>b.y;}int main() {    int T;    cin >> T;    while (T--){        scanf("%d%d",&s,&n);        for (int i=0; i<n; i++){            scanf("%d%d%d",&a[i].v,&a[i].x,&a[i].y);        }        sort(a,a+n,cmp);        memset(dp,0,sizeof(dp));        for (int j=0; j<n; j++){            for (int i=0; i<=s+a[j].y-a[j].x; i++){                if (i-a[j].y>=0)                        dp[i]=max(dp[i],dp[i+a[j].x-a[j].y]+a[j].v);            }        }        int ans=-1;        for (int i=0; i<=s; i++) {            if (dp[i]>ans) ans=dp[i];        }        printf("%d\n",ans);    }    return 0;}



                             

原创粉丝点击