zoukankan      html  css  js  c++  java
  • HDU-3449Consumer(依赖背包问题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3449

    题目大意:有很多个箱子和一些物品,想买箱子中的物品必须先买下箱子,求在规定的钱数里最多能买多大价值的东西

    Sample Input

    3 800
    300 2 30 50 25 80
    600 1 50 130
    400 3 40 70 30 40 35 60

    Sample Output

    210

    emmm,没什么好说的,就是板子套一套完事了。依赖背包分为主件和附件,解决这类问题就是对每个主件从dp数组中copy一个tmp数组,然后让这个主件中的附件对tmp数组做01背包,之后对每个值加上主件的体积和价值求一个max就ok了

    以下是AC代码:

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    
    const int mac=1e5+10;
    
    int dp[mac],f[mac];
    int poj[55][20],s[55],bag[55],val[55][20];
    
    int main() {
        int n,w;
        while (~scanf ("%d%d",&n,&w)) {
            memset(dp,0,sizeof dp);
            for (int i=1; i<=n; i++) {
                int m;
                scanf ("%d%d",&bag[i],&m);
                s[i]=m;
                for (int j=1; j<=m; j++)
                    scanf ("%d%d",&poj[i][j],&val[i][j]);
            }
            for (int i=1; i<=n; i++) {
                memcpy(f,dp,sizeof dp);
                for (int j=1; j<=s[i]; j++)
                    for (int k=w; k>=poj[i][j]; k--)
                        f[k]=max(f[k],f[k-poj[i][j]]+val[i][j]);
    
                for (int j=w; j>=bag[i]; j--)
                    dp[j]=max(dp[j],f[j-bag[i]]+0);
            }
            printf("%d
    ",dp[w]);
        }
    
        return 0;
    }
    路漫漫兮
  • 相关阅读:
    Xml命名空间添加前缀的意义
    解决vs Installer无法下载更新
    mongodb模糊查询
    mongodb排序
    mongodb如何修改_id
    向Mongodb中插入数组元素
    Mongodb 常见操作符
    452.用最少数量的箭引爆气球
    450.删除二叉搜索树中的节点-medium
    45.跳跃游戏 II
  • 原文地址:https://www.cnblogs.com/lonely-wind-/p/13263529.html
Copyright © 2011-2022 走看看