分析:
1、当饭卡余额小于5元直接输出,不能购买菜了。
2、选出一种价值最大的菜最后购买,以尽可能使余额走到负数。
3、以余额减去5作为背包容量,因为只有接近5时,之后才能用来买最大的菜,除去最大菜的每种菜的价格作为价值和重量;以使所卖菜的价格尽可能接近5。
#include<iostream>
#include<algorithm>
using namespace std;
int val[1001];
int dp[1001];
void DP(int n,int m)
{
int i,j;
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
for(j=m-5;j>=val[i];j--)
if(dp[j]<dp[j-val[i]]+val[i])
dp[j]=dp[j-val[i]]+val[i];
}
int main()
{
int n,m,i;
while(cin>>n &&n)
{
for(i=0;i<n;i++)
cin>>val[i];
cin>>m;
if(m<5)
{
cout<<m<<endl;
}
else
{
sort(val,val+n);
DP(n-1,m);
cout<<m-val[n-1]-dp[m-5]<<endl;
}
}
return 0;
}原文地址:http://blog.csdn.net/a809146548/article/details/45317167