排序后把前n-1个物品放到容量为m-5的背包中,获得最大值dp【m-5】,这就是尽量用前n-1个物品填满容量m-5的背包的结果,然后用m-dp【m-5】-a【n】就得到了结果
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n, a[1010], m, dp[1010];
int main()
{
while (cin >> n && n) {
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
cin >> m;
if (m < 5) {
cout << m << endl;
}
else {
sort(a + 1, a + 1 + n);
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n - 1; i++) {
for (int j = m - 5; j >= a[i]; j--) {
dp[j] = max(dp[j], dp[j - a[i]] + a[i]);
}
}
cout << m - dp[m - 5] - a[n] << endl;
}
}
return 0;
}