zoukankan      html  css  js  c++  java
  • Consumer (有依赖的背包)

    题目大意:

    给你一些物品,每个物品有自己的花费和价值,每个物品 都有相对应的箱子, 如果你想要买这个物品,你就需要先买这个箱子(依赖),求 n个箱子花费 t 能获得的最大价值

    思路:

    dp[i][j]  代表在 i 个箱子花费 j 能获得的最大价值

    我们需要优先对箱子进行处理,处理完之后其他的都和 01背包一样了 

    具体的看代码注释吧

    int dp[55][100010];
    int n,t,box,num;
    int main ()
    {
        int i,j,k;
        while(scanf("%d %d",&n,&t)!=EOF)
        {
             memset(dp,0,sizeof(dp));//初始化背包
            for(i=1;i<=n;i++)
            {
                scanf("%d %d",&box,&num);
                for (int j=0; j<=box;j++) //对盒子的处理(即依赖)
                    dp[i][j] = -1;
                for(k=t;k>=box;k--)
                    dp[i][k]=dp[i-1][k-box]; //先让每组数据拿到上组的状态
    
               //下列操作先算出我需要该组物品(盒子)
                for(j=0;j<num;j++)
                {
                    int c,w;
                    scanf("%d %d",&c,&w);
                    for(k=t;k>=c;k--)
                    {
                        if(dp[i][k-c]!=-1)
                            dp[i][k]=max(dp[i][k],dp[i][k-c]+w);
                    }
                }
                //取和不取的比较算出最大价值
                for(j=0;j<=t;j++)
                {
                    dp[i][j]=max(dp[i-1][j],dp[i][j]);
                }
            }
            printf("%d
    ",dp[n][t]);
        }
        return 0;
    }
  • 相关阅读:
    自动装箱和==和equals
    4.1 java 类加载器
    23种设计模式
    ionic2打包 配置路径
    ionic2 native app 更新用户头像暨文件操作
    Spring Security三种认证
    maven设置本地仓库地址和设置国内镜像
    ps选框工具全解
    最长公共子序列问题
    内部排序算法的稳定性
  • 原文地址:https://www.cnblogs.com/-Ackerman/p/12264623.html
Copyright © 2011-2022 走看看