题解:
直接五块钱买最贵的,剩下的进行01背包。
如果卡里的钱开始就少于五元,就直接输出。
#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL long long
int dp[10005],a[10005];
int main(){
int n,m;
while(scanf("%d",&n)!=EOF){
if(n==0) break;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
if(m<5){
printf("%d\n",m);
continue;
}
memset(dp,0,sizeof(dp));
sort(a+1,a+1+n);
for(int i=1;i<n;i++){
for(int j=m-5;j>=a[i];j--){
dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
}
}
printf("%d\n",m-a[n]-dp[m-5]);
}
}