Sample Input
1
50
5
10
1 2 3 2 1 1 2 3 2 1
50
0
Sample Output
-45
32
思路:01背包+贪心问题。用五块钱去买最贵的菜,减去5元后剩下的钱再尽可能多地买剩余的菜。
#include <bits/stdc++.h>
using namespace std;
int n,m;
int dp[10005],a[10005];
template<class T> T read()
{
T f=1,k=0;
char c=getchar();
while(c<'0' || c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0' && c<='9')
{
k=k*10+c-'0';
c=getchar();
}
return f*k;
}
int main()
{
while(scanf("%d",&n) && n)
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++) scanf("%d",a+i);
scanf("%d",&m);
sort(a+1,a+n+1);
if(m<5)
{
printf("%d\n",m);
continue;
}
else
{
for(int i=1;i<n;i++)
{
for(int j=m-5;j>=a[i];j--)
dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
}
printf("%d\n",m-a[n]-dp[m-5]);
}
}
return 0;
}