简单的01背包.
首先把价值最大的物品找出来.
然后在剩下的物品中求M - 5的01背包就可以了.
#include <iostream>
#include <cstdio>
#include <memory.h>
#include <cmath>
using namespace std;
const int maxn = 1001;
int V[maxn], dp[maxn],N, M;
int main(){
while(~scanf("%d", &N)){
int maxI = -1, maxV = -1;
for(int i = 0; i < N; ++i){
scanf("%d", &V[i]);
if(V[i] > maxV){
maxV = V[i];
maxI = i;
}
}
scanf("%d", &M);
int T = M - 5;
memset(dp, 0, sizeof(dp));
for(int i = 0; i < N; ++i){
if(i != maxI){
for(int j = T; j >= V[i]; --j){
dp[j] = max(dp[j], dp[j - V[i]] + V[i]);
}
}
}
int ans = M - dp[T] - maxV;
if(ans < 0){
printf("%d\n", -ans);
}else{//东西全部买完还有钱剩
printf("0\n");
}
}
return 0;
}