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; }
#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; }