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][1],dp[j][0]);

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

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long  LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-7;
const int Maxn=2010;
struct node
{
    int a,b,w;
}q[Maxn];
int dp[Maxn][2];
int main()
{
    int T,n,m,i,j;
    scanf("%d",&T);
    while(T--){
        scanf("%d %d",&m,&n);
        for(i=1;i<=n;i++)
            scanf("%d %d %d",&q[i].w,&q[i].a,&q[i].b);
        memset(dp,0,sizeof(dp));
        for(i=1;i<=n;i++){
            for(j=0;j<=m;j++){
                dp[j][0]=max(dp[j][1],dp[j][0]);
                if(j>=q[i].w)
                dp[j][1]=max(dp[j-q[i].w][0]+q[i].a+q[i].b,dp[j-q[i].w][1]+q[i].a);
            }
        }
        printf("%d\n",max(dp[m][0],dp[m][1]));
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-04 12:28:33

HDU 5410(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 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

HDU 5347(2015多校5)-MZL&#39;s chemistry(打表)

题目地址HDU 5347 无脑流神题,自行脑补,百度大法好. #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <set> #include <queue> #

HDU 5349(2015多校5)-MZL&#39;s simple problem(优先队列)

题目地址:HDU 5349 很水的优先队列就能搞好,只不过注意如果2操作结束后的队列为空,那么Max的值为-inf. #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <set&

HDU 5344(2015多校5)-MZL&#39;s xor(水题)

题目地址:HDU 5344 题意:求所有(Ai+Aj)的异或值. 思路:可以发现(Ai+Aj)和(Aj+Ai)的异或值为0,所以最后只剩下(Ai+Ai). #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm>

HDU 5371(2015多校7)-Hotaru&#39;s problem(Manacher算法求回文串)

题目地址:HDU 5371 题意:给你一个具有n个元素的整数序列,问你是否存在这样一个子序列,该子序列分为三部分,第一部分与第三部分相同,第一部分与第二部分对称,如果存在求最长的符合这种条件的序列. 思路:用Manacher算法来处理回文串的长度,记录下以每一个-1(Manacher算法的插入)为中心的最大回文串的长度.然后从最大的开始穷举,只要p[i]-1即能得出以数字为中心的最大回文串的长度,然后找到右边对应的'-1',判断p[i]是不是大于所穷举的长度,如果当前的满足三段,那么就跳出,继续

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

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]在当前物品时,

HDU 5358(2015多校联合训练赛1006) First One (区间合并+常数优化)

HDU 5358 题意: 求∑?i=1?n??∑?j=i?n??(?log?2??S(i,j)?+1)?(i+j). 思路: S(i,j) < 10^10 < 2^34,所以log2(S)+1的值只可能在1~35之间.由于log变化缓慢的函数特性,我们可以S(i,n)分作多个相同log值的区间来计算,用pos[i][j]预处理记录每个以i为起点,log(s)值为j的区间的右边界,即可优化至nlogn的复杂度. 主要是写起来比较难一些,一些细节比较纠结,一定思路理清后再写. ps.此题卡常数毫无