hdu5410(2015多校10)--CRB and His Birthday(背包问题)

题目链接:点击打开链接

题目大意:有m块钱,有n种货物,每种货物都有一个wi的价钱,假设买了x个i中货物,会花wi*x的钱,同时老板还会赠送a*x+b的糖果,问怎么样买礼物,可以让糖果数最多。

dp[i][j][0]当买到第i种的时候,花钱是j且没有买过i能得到最多的糖果数。

dp[i][j][1]当买到第i种的时候,花钱是j且买过i能得到的最多的糖果数。

按照货物数遍历从1到n,那么就可以省略一维,dp[i][0]在当前物品时,花钱为j的不买当前这件物品的最大值,dp[i][1]在当前物品时,花钱为j的并且买过当前物品的最大值。

那么状态转移方程就得到了

dp[i+w][1] = max(dp[i+w][1],dp[i][0]+a+b) ;

dp[i+w][1] = max(dp[i+w][1],dp[i][1]+a) ;

注意当更新一种物品后dp[i] = max(dp[i][0],dp[i][1]) ; dp[i][1]是0

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
int dp[2010][2] ;
int main() {
    int t , n , m , w , a , b , ans , i ;
    scanf("%d", &t) ;
    while( t-- ) {
        scanf("%d %d", &m, &n) ;
        ans = 0 ;
        memset(dp,0,sizeof(dp)) ;
        while(n--) {
            scanf("%d %d %d", &w, &a, &b) ;
            for(i = 0 ; i <= m ; i++) {
                if( i+w <= m ) {
                    dp[i+w][1] = max(dp[i+w][1],dp[i][0]+a+b) ;
                    dp[i+w][1] = max(dp[i+w][1],dp[i][1]+a) ;
                }
                dp[i][0] = max(dp[i][0],dp[i][1]) ;
                dp[i][1] = 0 ;
                ans = max(ans,dp[i][0]) ;
            }
        }
        printf("%d\n", ans) ;
    }
    return 0 ;
}

版权声明:转载请注明出处:http://blog.csdn.net/winddreams

时间: 2024-10-04 12:17:20

hdu5410(2015多校10)--CRB and His Birthday(背包问题)的相关文章

HDU 5414(2015多校10)-CRB and String(字符串处理)

题目地址:HDU 5414 题意:要求判断字符串s能否通过添加若干个字符得到字符串t 思路:这个题看起来复杂,其实仔细一分析,成功转化只包含两种情况.第一种因为要求插入的新字符和它前面的字符c不同,如果t中有x个连续的c,那么在s中也必须有x个连续的c:第二种是s必须是t的一个不连续子串. #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include

HDU 5410(2015多校10)-CRB and His Birthday(完全背包)

题目地址:HDU 5410 题意:有M元钱,N种礼物,若第i种礼物买x件的话,会有Ai*x+Bi颗糖果,现给出每种礼物的单价.Ai值与Bi值,问最多能拿到多少颗糖果. 思路:完全背包问题. dp[j][1]在当前物品时花钱为j的并且买过当前物品的最大值. dp[j][0]不买当前这件物品此前花钱为j的的最大值. 每种物品的价值随Ai线性变化,但是不随B[i]线性变化,B[i]仅是在第一次挑选第i件物品是才算入,其他时候均不算入.所以我们可以写出状态转移方程: dp[j][0]=max(dp[j]

hdu5414(2015多校10)--CRB and String(字符串匹配)

题目链接:pid=5414">点击打开链接 题目大意:有A.B两个字符串.如今有一种操作能够在A的随意一个字符x后面添加一个字符y(x.=y).问能不能将A变为B. 首先假设A能够变成B,那么A就一定是B的一个子序列,这个能够在O(n+m)的时间内算出. 假设A是B的子序列之后,推断添加的字符中是不是含有不能添加的情况,我们仅仅须要推断B从開始的一段连续的同样的字符串.是不是在A的开头也存在.假设存在,那么就是能够由A转化成B的. #include <cstdio> #incl

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&#39;s problem(manacher+二分/枚举)

HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分相同,第一部分与第二部分对称. 现在给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法,求出以第i个点为中心的回文串长度,记录到数组p中 要满足题目所要求的内容,需要使得两个相邻的回文串,共享中间的一部分,也就是说,左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也是一样. 因为我们已经记录下来以

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&amp;#39;s problem(manacher+二分/枚举)

pid=5371">HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分同样,第一部分与第二部分对称. 如今给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法.求出以第i个点为中心的回文串长度.记录到数组p中 要满足题目所要求的内容.须要使得两个相邻的回文串,共享中间的一部分,也就是说.左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也

hdu 5288||2015多校联合第一场1001题

http://acm.hdu.edu.cn/showproblem.php?pid=5288 Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number of i (l<=i<=r) , that there's no j(l<=j<=r,j<>i) satisfy ai mod aj=0,now OO want to know ∑i

hdu5289||2015多校联合第一场1002贪心+RMQ

http://acm.hdu.edu.cn/showproblem.php?pid=5289 Problem Description Tom owns a company and he is the boss. There are n staffs which are numbered from 1 to n in this company, and every staff has a ability. Now, Tom is going to assign a special task to

hdu5351(2015多校5)--MZL&#39;s Border(打表,,找规律)

题目链接:点击打开链接 题目大意:给出b1 = 'b' , b2 = 'a' , bi = b(i-1)b(i-2),将i-1和i-2链接起来,记录一个串的s[1-i] 和s[n-i+1-n]相同的话 Border,当i为最长是为LBorder,现在给让求在bn这个串上的前m个字符组成的子串的LBorder 通过计算可以发现,b字符串的前缀都是相同的,所以只要求出m的LBorder就行,和n是无关的,打表找出规律,找出对应不同的m,LBorder的值,因为存在大数,用java写 dp[i]第i层

2015 多校 #5 1005 MZL&#39;s chemistry

MZL's chemistry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1306    Accepted Submission(s): 601 Problem Description MZL define F(X) as the first ionization energy of the chemical element X N