有限制条件的01背包,关键点最贵的菜最后买,其余的n-1个就是普通的01背包问题
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1000+10;
int volume[N];
int f[N];
int MAX(int x,int y)
{
return x>y?x:y;
}
int main()
{
int n,v;
while(cin>>n,n)
{
memset(f,0,sizeof(f));
int max=-1;
for(int i=0;i<n;i++)
cin>>volume[i];
sort(volume,volume+n);//排好序
cin>>v;
if(v>=5)//防止直接输入个4,你还用背包。。。
{
v-=5;
for(i=0;i<n-1;i++)
for(int j=v;j>=volume[i];j--)
f[j]=MAX(f[j],f[j-volume[i]]+volume[i]);
cout<<v-f[v]-volume[n-1]+5<<endl;
}
else
cout<<v<<endl;
}
return 0;
}
HDU 2546 饭卡
最新推荐文章于 2021-07-24 16:07:19 发布