#include <iostream>
#include <algorithm>
using namespace std;
int a[1001],b[1001];
bool dp[1001];
int main()
{
int n,i,j,k,m;
while(scanf("%d",&n)!=EOF&&n)
{
memset(a,0,sizeof(a));
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
scanf("%d",&m);
if(m<5)
{
printf("%d\n",m);
continue;
}
if(m==5)
{
printf("%d\n",m-a[n-1]);
continue;
}
memset(dp,false,sizeof(dp));
dp[0]=true;
for(i=0;i<n-1;i++)
{
for(j=m-5;j>=a[i];j--)
{
if(dp[j-a[i]])
{
dp[j]=true;
continue;//mark1
}
}
}
for(j=m-5;j>=0;j--)
{
if(dp[j])
{
break;
}
}
printf("%d\n",m-j-a[n-1]);
}
return 0;
}
原题:http://acm.hdu.edu.cn/showproblem.php?pid=2546
初学,不是很明白,在mark1这里加了continue,time变成了0ms,貌似被优化了,如果不加是15ms,但不明白为什么,不知道会不会有问题....