http://acm.hdu.edu.cn/showproblem.php?pid=2546
感觉有点贪心在里面。要使饭卡里的钱最少,先对n种菜从小到大排序,m大于5的前提下,先拿出5元钱买最贵的菜,这样会使剩的钱最大程度的少,对剩下的m-5元进行01背包。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main()
{
int n,m;
int cost[1010];
int dp[1010];
while(~scanf("%d",&n) && n)
{
for(int i = 1; i <= n; i++)
scanf("%d",&cost[i]);
scanf("%d",&m);
memset(dp,0,sizeof(dp));
if(m < 5)
{
printf("%d\n",m);
continue;
}
sort(cost+1,cost+n+1);
int maxn = cost[n];
for(int i = 1; i <= n-1; i++)
{
for(int j = m-5; j >= cost[i]; j--)
{
dp[j] = max(dp[j],dp[j-cost[i]] + cost[i]);
}
}
printf("%d\n",m-dp[m-5]-maxn);
}
return 0;
}