特殊的01背包吧,先排序,然后当作01背包进行处理
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1001;
const int inf=1<<29;
int n,m,a[maxn],dp[maxn];
int main()
{
while(scanf("%d",&n)&&n)
{
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
if(m<5)
printf("%d\n",m);
else
{
sort(a,a+n);
int ans=m;
dp[m]=1;
for(int i=0;i<n;i++)
{
for(int j=5;j<=m;j++)
{
if(!dp[j])
continue;
if(j-a[i]>=5)
dp[j-a[i]]=1;
ans=min(ans,j-a[i]);
}
}
printf("%d\n",ans);
}
}
return 0;
}