您的位置:首页 > 其它

计蒜客 家具布置 (有依赖的背包问题)

2017-08-07 21:13 239 查看
题目来源:这个题目改编自NOIP2006 金明的预算方案 

题目思路:我们仔细想想,其实这个题目一共只有5种情况, 1主件+0附件  1主件+1号附件  1主件+2号附件  1主件+1号附件+2号附件  0主件+0附件;也就是说上述五种情况我们只能选择一种情况,那么就采用分组背包的方法,每一组我们只取出贡献最大的情况。

学到的东西:背包九讲中的内容还要细细体会。

代码:

#include<iostream>
using namespace std;
int main()
{
int a,b,mx=0;
int i,j;
int m,n,v[61]={0},p[61]={0},q;
int v1[61]={0},v2[61]={0},p1[61]={0},p2[61]={0};
int f[50001]={0};
cin>>m>>n;
m/=10;
for(i=1;i<=n;i++){
cin>>a>>b>>q;
a/=10;
if(q!=0)
{
if(v1[q]==0){v1[q]=a;p1[q]=b;}
else {v2[q]=a;p2[q]=b;}
}
else{
v[i]=a;p[i]=b;
}
}
for(int i=1;i<=n;i++)
for(int j=m;j>=v[i];j--){//上述跟0 1背包的过程无异,下面求解留下哪一个价值最大,利用解决背包的do方法
f[j]=max(f[j],f[j-v[i]]+v[i]*p[i]);
if(j-v1[i]-v[i]>=0)f[j]=max(f[j],f[j-v1[i]-v[i]]+v1[i]*p1[i]+v[i]*p[i]);
if(j-v2[i]-v[i]>=0)f[j]=max(f[j],f[j-v2[i]-v[i]]+v2[i]*p2[i]+v[i]*p[i]);
if(j-v1[i]-v2[i]-v[i]>=0)f[j]=max(f[j],f[j-v1[i]-v2[i]-v[i]]+v1[i]*p1[i]+v2[i]*p2[i]+v[i]*p[i]);
mx=max(f[j],mx);
}
cout<<mx*10<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: