Vijos1407_古韵之刺绣

来源:互联网 发布:狸窝ppt转换器mac 编辑:程序博客网 时间:2024/04/27 16:05

因为本身楼主对于编程这方面很菜,所以请多多包容,谢谢。

//下面是正文

古韵之刺绣是一道简单的01背包,难的地方因该是题目的理解和对数据的预处理,首先我先来吧01背包的程序给大家。

for(i=1;i<=n;i++) {for(j=m;j>=v[i];j--) {a[j]=max(a[j],a[j-v[i]]+w[i]);}}
在这段代码里,n表示物品个数,m表示最大容量,因为我用的是一位数组,所以第二重循环要递减,v[ ]表示存入背包要占用的空间,w[ ]则是价值。

因为题目描述不是很清楚,所以我来说明题目中一个隐藏着的信息——实际一张刺绣的价值因该是布的体积*花纹美观度,而刺绣的体积因该是布的体积+布的体积*花纹体积

也就是说,布的每个体积单位都有一个花纹

所以预处理因该是这样的:

for(i=1;i<=n;i++) {cin>>v[i]>>k;w[i]=v[i]*mp[k];v[i]+=v[i]*mmp[k];}
这里我用了一个STL工具,map——映射,mp代表的是花纹美观度(价值),mmp表示花纹的体积。

我觉得需要讲的就这么多,下面是我的程序:

#include <bits/stdc++.h>using namespace std;int w[1001],v[1001],a[10001],v1[1001];int main(){map<int,int> mp;map<int,int> mmp;memset(a,0,sizeof(a));int i,j,k,l,n,m;cin>>n>>m;for(i=1;i<=3;i++) {int x,y;cin>>l>>x>>y;mmp[l]=y;mp[l]=x;}for(i=1;i<=n;i++) {cin>>v[i]>>k;//cout<<w[i]<<" "<<v[i]<<endl;w[i]=v[i]*mp[k];v[i]+=v[i]*mmp[k];//cout<<mmp[k]<<" "<<mp[k]<<endl;//cout<<w[i]<<" "<<v[i]<<endl<<endl;}for(i=1;i<=n;i++) {for(j=m;j>=v[i];j--) {a[j]=max(a[j],a[j-v[i]]+w[i]);}}cout<<a[m]<<endl;return 0;}

0 0
原创粉丝点击