01背包之后,dp[i]里面是所有组合到i的最优值,所以筛选一下就行了
#include<iostream>
using namespace std;
int main()
{
int a[30],dp[1000005];
int n,b;
while(cin>>n>>b)
{
int sum=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++) //01背包
{
for(int j=sum;j>=a[i];j--)
dp[j]=max(dp[j-a[i]]+a[i],dp[j]);
}
int ans=0x7FFFFFFF;
for(int i=0;i<=sum;i++)//筛选过程
{
if(dp[i]>=b)
ans=ans>dp[i]? dp[i]:ans;
}
cout<<ans-b<<endl;
}
return 0;
}