zoukankan      html  css  js  c++  java
  • 【bzoj4247】挂饰 背包dp

    题目描述

    JOI君有N个装在手机上的挂饰,编号为1...N。 JOI君可以将其中的一些装在手机上。
    JOI君的挂饰有一些与众不同——其中的一些挂饰附有可以挂其他挂件的挂钩。每个挂件要么直接挂在手机上,要么挂在其他挂件的挂钩上。直接挂在手机上的挂件最多有1个。
    此外,每个挂件有一个安装时会获得的喜悦值,用一个整数来表示。如果JOI君很讨厌某个挂饰,那么这个挂饰的喜悦值就是一个负数。
    JOI君想要最大化所有挂饰的喜悦值之和。注意不必要将所有的挂钩都挂上挂饰,而且一个都不挂也是可以的。

    输入

    第一行一个整数N,代表挂饰的个数。
    接下来N行,第i行(1<=i<=N)有两个空格分隔的整数Ai和Bi,表示挂饰i有Ai个挂钩,安装后会获得Bi的喜悦值。 

    输出

    输出一行一个整数,表示手机上连接的挂饰总和的最大值

    样例输入

    5
    0 4
    2 -2
    1 -1
    0 1
    0 3

    样例输出

    5


    题解

    背包dp

    根据题意很容易想到dp状态:f[i][j]表示从前i个物品中选择某些物品,使得剩下的挂钩数量为j的最大喜悦值。

    但是这样会TLE。

    思考:一个物品,最多只会消耗1个挂钩。因此如果已经有了大于等于超过n个挂钩,说明全部物品都可以挂上,记录过多的状态也就没有了意义。

    所以我们把j的上界设为n即可,dp时取j+ai和n的最小值作为状态即可。

    注意要先按照挂钩数量从大到小排序(其实不排序也行,就是会比较麻烦)

    代码中把状态压到了一维,需要注意一下更新顺序啥的。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define N 2010
    using namespace std;
    struct data
    {
    	int a , b;
    }w[N];
    int f[N];
    bool cmp(data x , data y)
    {
    	return x.a > y.a;
    }
    int main()
    {
    	int n , i , j , ans = 0;
    	scanf("%d" , &n);
    	for(i = 1 ; i <= n ; i ++ ) scanf("%d%d" , &w[i].a , &w[i].b) , w[i].a -- ;
    	sort(w + 1 , w + n + 1 , cmp);
    	memset(f , 0xc0 , sizeof(f)) , f[1] = 0;
    	for(i = 1 ; i <= n ; i ++ )
    	{
    		if(~w[i].a) for(j = n ; j ; j -- ) f[min(j + w[i].a , n)] = max(f[min(j + w[i].a , n)] , f[j] + w[i].b);
    		else for(j = 1 ; j <= n ; j ++ ) f[j - 1] = max(f[j - 1] , f[j] + w[i].b);
    		for(j = 0 ; j <= n ; j ++ ) ans = max(ans , f[j]);
    	}
    	printf("%d
    " , ans);
    	return 0;
    }
    

     

  • 相关阅读:
    mybatis sql in 查询
    js中同一个onclick绑定了两个js方法出现的问题
    异步ztree 加复选框 及相应后台处理
    让delphi程序不受WINDOWS日期格式的影响
    Delphi调用java开发的WebService,传入参数出错
    在Delphi中实现HexToStr函数和StrToHex函数
    最快的安卓模拟器Genymotion
    详解Android中AsyncTask的使用
    JNI之——&#39;cl&#39; 不是内部或外部命令,也不是可执行的程序或批处理文件
    CorePlot学习六---点击scatterPlot中的symbol点时弹出对应的凝视
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/7076614.html
Copyright © 2011-2022 走看看