3985 不开心的金明
我只想说,为什么金明这么…出镜率高,太出名了,关于他的题都好相似,容易搞混
这个题很像一个裸的01背包
妈妈看了购物单进行一个审查,要求购物单上所有的物品价格极差不超过3
这样,我们把300做成分界线分成两个部分,当最小值<=300当成一个背包,>300用贪心
为什么?
看n的取值范围为100也就是最大是100,极差是3,那么最便宜的和最贵的差就是300,如果这个差值在minn>300无论怎么都不会买另一件了,也就是说,这个时候可以买最大的件数就是w/maxx,所以只需要将价值进行一个从大到小排序,选择w/maxx件就是答案了
如果不是这种情况,就是背包决策问题了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
int n,w;
const int SIZE=20000;
int vi[SIZE],wi[SIZE];
int f[SIZE];
int minn=99999999,maxx;
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
cin>>n>>w;
for(int i=1;i<=n;i++)
{
cin>>vi[i]>>wi[i];
minn=min(minn,vi[i]);
maxx=max(maxx,vi[i]);
}
if(minn<=300)//跑背包
{
for(int i=1;i<=n;i++)
{
for(int j=w;j>=vi[i];j--)
{
f[j]=max(f[j],f[j-vi[i]]+wi[i]);
}
}
cout<<f[w]<<endl;
}
else
{
int ans=0;
sort(wi+1,wi+1+n,cmp);
for(int i=1;i<=w/maxx;i++)
ans+=wi[i];
cout<<ans<<endl;
}
return 0;
}