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;
    }
  • 相关阅读:
    《人月神话》阅读笔记02
    《人月神话》阅读笔记01
    第十四周学习进度条
    我们做的作品 请大家多多支持我们
    Beta阶段项目总结
    Alpha阶段项目总结
    Alpha版总结会议
    站立会议10(第二次冲刺)
    站立会议09(第二次冲刺)
    站立会议08(第二次冲刺)
  • 原文地址:https://www.cnblogs.com/-Ackerman/p/12264623.html
Copyright © 2011-2022 走看看