hdu 3449 Consumer (依赖01背包)

题目:

链接:点击打开链接

题意:

思路:

dp[i][j]表示前i个箱子装j钱的材料可以得到的最大价值。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 100010

int dp[55][MAXN];

int main()
{
    //freopen("input.txt","r",stdin);
    int n,v;
    int pi,mi;
    int c,w;
    while(scanf("%d%d",&n,&v) != EOF)
    {
        memset(dp,0,sizeof(dp));
        for(int i=1; i<=n; i++)
        {
            scanf("%d%d",&pi,&mi);
            for(int j=0; j<=pi; j++)
                dp[i][j] = -1;
            for(int j=v; j>=pi; j--)//依赖
                dp[i][j] = dp[i-1][j-pi];
            for(int j=0; j<mi; j++)//01背包
            {
                scanf("%d%d",&c,&w);
                for(int k=v; k>=c; k--)
                {
                    if(dp[i][k-c] != -1)
                        dp[i][k] = max(dp[i][k],dp[i][k-c]+w);
                }
            }
            for(int j=v; j>=0; j--)//...........
                dp[i][j] = max(dp[i][j],dp[i-1][j]);
        }
        printf("%d\n",dp[n][v]);
    }
    return 0;
}
时间: 2024-10-18 20:02:34

hdu 3449 Consumer (依赖01背包)的相关文章

HDU 2602 (简单的01背包) Bone Collector

很标准的01背包问题 1 //#define LOCAL 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6 7 const int maxn = 1000 + 10; 8 int w[maxn], v[maxn], dp[maxn]; 9 10 int main(void) 11 { 12 #ifdef LOCAL 13 freopen(&qu

HDu 3449 (有依赖的01背包) Consumer

题意: 有n件物品,对应有不同的价格和价值,这是典型的01背包.但现在有了一个限制,要买物品先买能装这件物品的特定的盒子,盒子的价值为0 代码理解得还不是太好,感觉这是一个“二重”的01背包.首先假设先买第i个盒子,对每个盒子里的物品进行一次01背包:然后对盒子再进行一次01背包,决策到底要不要买这个盒子 dp[i][j]表示前i个盒子有j元钱能获得的最大价值,则所求就是dp[n][total] 因为物品对盒子有了“依赖”,所以要先对dp赋值为-1,表示买不到盒子就更不可能装物品 这篇题解写的很

hdu 3449 (有依赖的01背包)

依赖背包 事实上,这是一种树形DP,其特点是每个父节点都需要对它的各个儿子的属性进行一次DP以求得自己的相关属性. fj打算去买一些东西,在那之前,他需要一些盒子去装他打算要买的不同的物品.每一个盒子有特定要装的东西(就是说如果他要买这些东西里的一个,他不得不先买一个盒子).每一种物品都有自己的价值,现在FJ只有W元去购物,他打算用这些钱买价值最高的东西. Problem Description FJ is going to do some shopping, and before that,

HDU 1171 Big Event in HDU(母函数或01背包)

Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 44151    Accepted Submission(s): 15191 Problem Description Nowadays, we all know that Computer College is the biggest department

hdu 3466 Proud Merchants(0-1背包+排序)

题目来源:hdu 3466 Proud Merchants Proud Merchants Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 3595 Accepted Submission(s): 1500 Problem Description Recently, iSea went to an ancient country. For

HDU 2546 饭卡(01 背包)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546 思路:需要首先处理一下的的01背包,当饭卡余额大于等于5时,是什么都能买的,所以题目要饭卡余额最小,那预留5元(相当于饭卡余额为5)来买最贵的菜 然后对剩下n-1进行01背包dp才是正确的.但是还存在一个问题,那就饭卡初始余额小于5时,也要处理掉. 下面讲01背包(原型可以看大牛的背包九讲,本人也正在学习),定义dp[i][j]为买前i种菜品剩下j元时的最大消费值等于下面两中情况之一的值 有两种来

HDU 2546 饭卡(01背包裸题)

饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 28562    Accepted Submission(s): 9876 Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无

HDU 2602 Bone Collector(01背包裸题)

Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 60469    Accepted Submission(s): 25209 Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bo

HDU 5234 Happy birthday 01背包

题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5234 bc:http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=585&pid=1003 题解: 由于数据比较小,所以可以转化为判定性问题,即: dp[i][j][kk]表示走到i,j这一点时吃了kk重的蛋糕,转移方程只要考虑这一点的蛋糕吃和不吃两种情况(01背包) 代码: 1 #include<ios