01背包,容量不定
#include<stdio.h>
#include<string.h>#include<iostream>
using namespace std;
int dp[20000005];
int w[25];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&w[i]);
sum+=w[i];
}
for(int i=0;i<=sum;i++) //用 memset 会 Memory Limit Exceeded
{
dp[i]=0;
}
for(int i=1;i<=n;i++)
{
for(int j=sum;j>=w[i];j--)
{
if(dp[j]<m){
dp[j]=max(dp[j-w[i]]+w[i],dp[j]);
}
}
}
for(int i=m;i<=sum;i++)
{
if(dp[i]-m>=0)
{
printf("%d\n",dp[i]-m);
break;
}
}
}
}