http://poj.org/problem?id=3628
源代码:
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
const int INF =20000001;
#define N 21
int height[N];
int dp[INF];
void dp1(int n,int sum,int height[]);
int max(int a,int b);
int main()
{
int n,h;
while(scanf("%d %d",&n,&h)==2)
{
int i,y;
int sum=0;
for(i=1;i<=n;i++)
{
scanf("%d",&height[i]);
sum+=height[i];
}
for(i=0;i<=sum;i++)
dp[i]=-1;
dp1(n,sum,height);
for(i=h;i<=sum;i++)
{
if(dp[i]==i)
{
y=i-h;
break;
}
}
printf("%d\n",y);
}
return 0;
}
void dp1(int n,int sum,int height[])
{
int i,j;
dp[0]=0;
for(i=1;i<=n;i++)
for(j=sum;j>=height[i];j--)
dp[j]=max(dp[j],dp[j-height[i]]+height[i]);
return ;
}
int max(int a,int b)
{
return a>b?a:b;
}