这个相当于体积和价值一样大的01背包。
#include<iostream>
using namespace std;
const int mm=10000000;
int f[mm];
int h[22];
int i,j,k,n,b,m;
int main()
{
while(cin>>n>>b)
{
for(i=0;i<n;i++)
{
cin>>h[i];
m+=h[i];
}
memset(f,0,sizeof(f));
for(i=0;i<n;i++)
for(j=m;j>=h[i];--j)
{
if(f[j]<f[j-h[i]]+h[i])
f[j]=f[j-h[i]]+h[i];
}
int min=INT_MAX;
for(i=b;i<=m;++i)
{
if(f[i]>=b && f[i]-b<min)
min=f[i]-b;
}
cout<<min<<endl;
}
return 0;
}