题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546
题目分析:先用一个sort函数对输入的菜价进行排序。使最后的钱够五元用来买最贵的那个菜
注意:若是刚开始便不够五元直接输出。
代码
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
int main()
{
int n, cost[1010], money, dp[1010];
while(scanf("%d", &n)&&n)
{
int sum=0;
for(int i=0;i<n;i++)
cin>>cost[i];
scanf("%d",&money);
sort(cost,cost+n);
if(money<5)cout<<money<<endl;
else
{
money-=5;//先减去买最贵的菜的五元钱
memset(dp,0,sizeof(dp));
for(int i=0;i<n-1;i++)//选菜
for(int j=money;j>=cost[i];j--)
dp[j]=max(dp[j],dp[j-cost[i]]+cost[i]);//状态转移方程
printf("%d\n",money+5-cost[n-1]-dp[money]);
}
}
return 0;
}