题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546
题意:
食堂有n种菜
每种菜的价格
卡上余额m
当卡上余额大于等于5是可以买任意一种菜,小于5时不能买
求卡上余额最少是多少
比如:
菜价45 50,卡上余额5
那么买菜后余额最少就是-45
解题思路:
01背包的变形
如果m<5,直接输出卡上余额
如果m=5,买最贵的
如果m>5,先把5元拿出来,用来买最贵的那个菜,剩下m-5元,用背包算出最多能买多少菜
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int a[1005];
int s[1005];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int n,m;
while(scanf("%d",&n)!=EOF,n)
{
memset(s,0,sizeof(s));
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n,cmp);
scanf("%d",&m);
m-=5;
if(m<0)
{
printf("%d\n",m+5);
continue;
}
if(m==0)
{
printf("%d\n",5-a[0]);
continue;
}
for(int i=1;i<n;i++)
{
for(int j=m;j>=a[i];j--)
{
s[j] = max(s[j],s[j-a[i]]+a[i]);
}
}
int res = m-s[m]+5-a[0];
printf("%d\n",res);
}
return 0;
}