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\n",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\n",f[n]);
    return 0;
}

 

posted @ 2017-06-20 19:59  ANhour  阅读(822)  评论(0编辑  收藏  举报