中文题。
m 小于 5 时直接输出 m,否则 01 背包搞。因为要值最小,所以 01 背包搞时不考虑最大价格的那个菜,搞完再减去最大价格的菜。
#include<cstring>
#include<cstdio>
#include<cstring>
#include<cmath>
#include <vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int dp[1005];
int w[1005];
int main(){
//freopen("a.txt", "r", stdin);
int n, m;
while(scanf("%d", &n) != EOF && n){
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; i++)
scanf("%d", &w[i]);
scanf("%d", &m);
sort(w+1, w+n+1);
if(m < 5) cout << m << endl;
else{
for(int i = 1; i <= n-1; i++){
for(int j = m-5; j >= w[i]; j--){
dp[j] = max(dp[j], dp[j-w[i]]+w[i]);
}
}
int ans = m-dp[m-5]-w[n];
cout << ans << endl;
}
}
return 0;
}