HDU 2546 饭卡
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546
解析:将余额中的5元拿出来买最贵的物品,除去最贵的物品后在进行01背包。
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
bool cmp(int a,int b)
{
if(a>b)
return true;
return false;
}
int max(int a,int b)
{
return a>b? a:b;
}
int main()
{
int n,i,j,m,ans;
int dp[2010];//一维余额,dp值是余额
int v[2010];
while(scanf("%d",&n)!=EOF,n)
{
memset(dp,0,sizeof dp);
for(i=0;i<n;i++)
scanf("%d",&v[i]);
sort(v,v+n,cmp);
scanf("%d",&m);
if(m<5)
{
printf("%d\n",m);
continue;
}
ans=5-v[0]; //拿出5块钱去买最贵的菜
m-=5;
//除去最贵的菜,剩下的01背包一遍
for(i=1;i<n;i++)
{
for(j=m;j>=v[i];j--)
{
dp[j]=max(dp[j],dp[j-v[i]]+v[i]);
}
}
printf("%d\n",m-dp[m]+ans);
}
return 0;
}
/*
3
8 3 6
10
-1
3
13 3 6
10
-6
3
10 13 3
6
-7
*/