http://acm.hdu.edu.cn/showproblem.php?pid=2546
// 很想0 1背包的问题,可是又有很大的变形,一开始以为是贪心,写了一个好囧的代码,wrong
// 又写了一个不是很熟悉的0 1 背包, 又wrong。好好努力!!
#include<iostream>//2251214 2010-03-26 18:00:08 Accepted 2546 31MS 304K 557 B C++ 悔惜晟
#include<algorithm>
using namespace std;
int a[1002];
int f[1002];
bool hash[1002];
int main()
{
int n, m, i, j, min;
while(cin>>n && n != 0)
{
for(i = 0; i < n ; i++)
cin>>a[i];
cin>>m;
sort(a, a+n);
min = 0;
for(i =0 ;i <= m -5; i++)
hash[i] =0;
hash[0] =1;
for( i =0; i < n; i++)
{
for(j = m - 5; j >= 0; j--)//卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),
//否则无法购买(即使金额足够) 解决问题的关键
{
if(hash[j] == 1)
{
hash[j + a[i] ] = 1;
if(min < j + a[i])
{
min = j + a[i];
}
}
}
}
cout<<m - min<<endl;
}
}