您的位置:首页 > 其它

hdu2546(01背包变形)

2016-08-31 17:21 309 查看
01背包变形

根据情况变形,由题意知,首先拿出5元买最贵的东西,那接下来就是背包容量m-5,物品数量n-1 的01背包问题了

状态方程

 dp[j]=max(dp[j],dp[j-vo[i]+vo[i])

#include<iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int vo[1005];
int dp[1005];
int main()
{
int n,v;
while(cin>>n&&n)
{
for(int i=1;i<=n;i++)
cin>>vo[i];
cin>>v;
memset(dp,0,sizeof(dp));
sort(vo+1,vo+n+1);//wa==>(vo,vo+n)
int maxn=vo
;
if(v<5)
cout<<v<<endl;
else{
v=v-5;
for(int i=1;i<n;i++)
{
for(int j=v;j>=vo[i];j--)
{
if(dp[j]<dp[j-vo[i]]+vo[i])//或者用dp[j]=max(dp[j],dp[j-vo[i]+vo[i])
dp[j]=dp[j-vo[i]]+vo[i];
}
}
cout<<v+5-dp[v]-maxn<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: