分析:
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