• 【刷题】【dp】【背包】金明的预算


    有附件的背包的常规算法

    #include<cstdio>
    #include<cstdlib>
    #include<vector>
    using namespace std;
    int m,n;
    const int M=32000,N=60;
    int f[N+3][M+3];
    vector <int> son[N+3],ff[N+3];
    vector <int> v,w;
    
    int main()
    {
        scanf("%d%d",&m,&n);
        int fa,vv,ww;
        v.push_back(0),w.push_back(0);  
        for(int i=1;i<=n;i++)
            scanf("%d%d%d",&ww,&vv,&fa),son[fa].push_back(i),v.push_back(vv*ww),w.push_back(ww)  ;
        
        int sz=son[0].size() ;
        for(int i=0;i<sz;i++)
        {
            int zj =son[0][i];
            f[zj ][w[zj ]]=v[zj ];
            
            int fj_sz=son[zj].size() ;
            for(int j=0;j<fj_sz;j++)
            {
                int fj=son[zj][j];
                for(int k=m;k>=w[zj]+w[fj];k--)
                    if(f[zj][k-w[fj]]) f[zj][k]=max(f[zj][k],f[zj][k-w[fj]]+v[fj]);
            }
            
            son[zj].clear() ;
            for(int k=m;k>=w[zj];k--)
                if(f[zj][k]) son[zj].push_back(++n),w.push_back(k),v.push_back(f[zj][k]);   
                
            fj_sz=son[zj].size() ;
            for(int k=m;k>=w[zj];k--)
                for(int j=0;j<fj_sz;j++)
                {
                    int fj=son[zj][j];
                    if(k>=w[fj])
                        f[0][k]=max(f[0][k],f[0][k-w[fj]]+v[fj]);
                }
    
        }
        printf("%d
    ",f[0][m]);
        return 0;
    } 
  • 相关阅读:
    51Nod 1009 数字1的数量(思维)
    「CTSC 2008」祭祀
    「CSA Round #41」BFS-DFS
    「CEOI2008」order
    「HEOI 2016/TJOI 2016」求和
    「HAOI 2018」染色
    「CF 961G」Partitions
    「WC 2007」剪刀石头布
    「POI 2010」Bridges
    「CQOI 2014」危桥
  • 原文地址:https://www.cnblogs.com/xwww666666/p/11347891.html
Copyright © 2020-2023  润新知