zoukankan      html  css  js  c++  java
  • 电视游戏问题【DP】【背包】

    题目大意:
    n个游戏平台,每个游戏平台有C[i]个游戏,但是需要花W[i]块钱才能买这个游戏平台。而且每个游戏平台里的游戏需要花w[i]元钱,但是买了这个游戏可以增加c[i]产奶量。在只有m元的情况下,最多能增加多少产奶量?

    Input

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

    Output

    210

    思路:
    我们设f[0][i][j]表示不买这个游戏,能增加的最大产奶量,f[1][i][j]表示买这个游戏能增加的最大产奶量。那么就有

    f[0][i][j]=f[1][i1][jw[i]]
    f[0][i][j+w]=max(f[0][i1][j+w[i]],f[0][i1][j]+c[i])
    f[1][j]=max(f[0][i1][j],f[1][i1][j]);

    我们发现,i只和i1有关系,所以方程又转化为
    f[0][j]=f[1][jW];
    f[0][j+w]=max(f[0][j+w],f[0][j]+c);
    f[1][j]=max(f[0][j],f[1][j]);

    就是一个完整的01背包啦!


    代码:

    #include <cstdio>
    #include <iostream>
    using namespace std;
    
    int n,m,W,C,f[2][100001],w,c,s;
    
    void fre()
    {
        freopen("vidgame.in","r",stdin);
        freopen("vidgame.out","w",stdout);
    }
    
    int main()
    {
        fre();
        scanf("%d%d",&n,&m);
        for (int k=1;k<=n;k++)
        {
            scanf("%d%d",&W,&C);  //由于i只和i-1有关,所以W[i]和C[i]都可以变为变量
            for (int i=W;i<=m;i++)
            {
                f[0][i]=f[1][i-W];  //方程1
            }
            for (int i=1;i<=C;i++)
            {
                scanf("%d%d",&w,&c);
                for (int j=m-w;j>=W;j--)
                  f[0][j+w]=max(f[0][j+w],f[0][j]+c);  //方程2
            }
            for (int i=1;i<=m;i++) f[1][i]=max(f[0][i],f[1][i]);  //更新值,f[1][i]为本次答案。
        }
        return printf("%d\n",f[1][m])&0;
    }
  • 相关阅读:
    分层图最短路(DP思想) BZOJ2662 [BeiJing wc2012]冻结
    动态规划 BZOJ1925 地精部落
    线性DP SPOJ Mobile Service
    线性DP codevs2185 最长公共上升子序列
    数位DP POJ3208 Apocalypse Someday
    线性DP POJ3666 Making the Grade
    杨氏矩阵 线性DP? POJ2279 Mr.Young's Picture Permutations
    tarjan强连通分量 洛谷P1262 间谍网络
    树链剖分 BZOJ3589 动态树
    二分图 BZOJ4554 [Tjoi2016&Heoi2016]游戏
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313045.html
Copyright © 2011-2022 走看看