您的位置:首页 > 其它

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

2017-06-20 19:59 375 查看

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
);
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: