对所有价格进行排序,将价值最大的留下来最后用必然可以构造对低价格,对前面n-1的菜模拟0/1背包求出<=m-5的最大价格
#include<iostream>
#include<algorithm>
#include<cstring>
#define Max(a,b) (a<b?b:a)
using namespace std;
int n;
int p[1001];
int m;
bool dp[50001];
bool cmp(int *a,int *b){
return (*a) - (*b);
}
int main(){
while(cin >> n && n){
for(int i = 0; i < n; i++){
cin >> p[i];
}
cin >> m;
memset(dp,0,sizeof(dp));
dp[0]=1;
int ans=0;
sort(p,p+n);
for(int i = 0; i < n-1; i++){
for(int j = m-5; j >= p[i]; j--){
dp[j] = Max(dp[j],dp[j-p[i]]);
if(dp[j]) ans=Max(ans,j);
}
}
if(m<5) cout<<m<<endl;
else cout<<m-(ans+p[n-1])<<endl;
}
return 0;
}