题目链接:点击打开链接
把最大的减去就是01背包了;
#include <iostream>
#include <cstring>
#include<algorithm>
using namespace std;
const int maxn=1e3+10;
int a[maxn],dp[maxn];
int main()
{
int m,i,j,n,k,v,Max,pos;
while(cin>>n&&n)
{
Max=-1;
for(i=1; i<=n; i++)
cin>>a[i];
sort(a+1,a+n+1);
Max=a[n];
cin>>v;
if(v<5)cout<<v<<endl;
else
{
int k=v-5;
memset(dp,0,sizeof(dp));
for(i=1; i<n; i++)
for(j=k; j>=a[i]; j--)
{
dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
}
cout<<v-dp[k]-Max<<endl;
}
}
return 0;
}