• codevs 1155今明的预算方案(复习有依赖性的背包问题)


    1155 金明的预算方案

    【题目大意】买附件必须买主件。

    在一定钱数内 求总价值最大。

    【题解】有依赖性的背包问题。

    【code】

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    int n,m,zc,ans;
    
    int c[100],pri[100][5],imp[100][5];
    
    void dfs(int x,int res,int nowa){
        ans=max(ans,nowa);
        if(res==0)return;
        if(x>zc)return;
        dfs(x+1,res,nowa);
        if(res-pri[x][0]>=0)dfs(x+1,res-pri[x][0],nowa+pri[x][0]*imp[x][0]);
        if(c[x]){
            if(res-pri[x][0]-pri[x][1]>=0)dfs(x+1,res-pri[x][0]-pri[x][1],nowa+pri[x][0]*imp[x][0]+pri[x][1]*imp[x][1]);
            if(c[x]==2){
                if(res-pri[x][0]-pri[x][2]>=0)dfs(x+1,res-pri[x][0]-pri[x][2],nowa+pri[x][0]*imp[x][0]+pri[x][2]*imp[x][2]);
                if(res-pri[x][0]-pri[x][1]-pri[x][2]>=0)dfs(x+1,res-pri[x][0]-pri[x][1]-pri[x][2],nowa+pri[x][0]*imp[x][0]+pri[x][1]*imp[x][1]+pri[x][2]*imp[x][2]);
            }
        }
    }
    
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
            int v,p,q;
            scanf("%d%d%d",&v,&p,&q);
            if(q==0)pri[++zc][0]=v,imp[zc][0]=p;
            else {
                c[q]++;int a=c[q];
                pri[q][a]=v;imp[q][a]=p;
            }
        }
        dfs(1,n,0);
        printf("%d
    ",ans);
        return 0;
    }
    50暴力
    #include<iostream>
    #include<cstdio>
    using namespace std;
    struct e
    {
        int v,p,q,w,f[66];
    }g[66];
    int n,m,f[35000];
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&g[i].v,&g[i].p,&g[i].q);
            g[i].w=g[i].v*g[i].p;
            if(g[i].q!=0)
            g[g[i].q].f[++g[g[i].q].f[0]]=i;
        }
        for(int i=1;i<=m;i++)
        {
            if(g[i].q==0)
            {
                int f1=g[i].f[1],f2=g[i].f[2];
                for(int j=n;j>=g[i].v;j--)
                {
                    if(f1&&j-g[f1].v-g[i].v>=0)
                    f[j]=max(f[j],f[j-g[i].v-g[f1].v]+g[i].w+g[f1].w);
                    if(f2&&j-g[f2].v-g[i].v>=0)
                    f[j]=max(f[j],f[j-g[i].v-g[f2].v]+g[i].w+g[f2].w);
                    if(f1&&f2&&j-g[i].v-g[f1].v-g[f2].v>=0)
                    f[j]=max(f[j],f[j-g[i].v-g[f1].v-g[f2].v]+g[i].w+g[f1].w+g[f2].w);
                    f[j]=max(f[j],f[j-g[i].v]+g[i].w);
                    
                }
            }
        }
        printf("%d
    ",f[n]);
        return 0;
    }
  • 相关阅读:
    有序向量
    无序向量
    设计模式入门
    策略模式
    面向对象相关知识点
    MySQL数据库知识培训
    数据库业务规范
    go最小路径
    go求质数
    CSS3
  • 原文地址:https://www.cnblogs.com/zzyh/p/7056056.html
Copyright © 2020-2023  润新知