分析:为了得到最优解,从m中取出5来买最贵的。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <cmath> #include <cstdlib> #include <map> using namespace std; int a[1005]; int dp[1005]; const int oo = 1e9+7; int main() { int n, m; while(scanf("%d", &n), n) { for(int i=1; i<=n; i++) { scanf("%d", &a[i]); } scanf("%d", &m); sort(a+1, a+n+1); memset(dp, 0, sizeof(dp)); if(m<5) { printf("%d ", m); continue; } int mm = m-5; for(int i=1; i<n; i++) { for(int j=mm; j>=a[i]; j--) { dp[j] = max(dp[j], dp[j-a[i]]+a[i]); } } printf("%d ", m-a[n]-dp[m-5]); } return 0; }