题目大意:给你n个数和一个指定高度,让你从n个数的选出几个数比指定高度大,但是尽量接近指定高度。
解题思路:明显的01背包,初始全部赋值成0.最后在遍历一次,找到最大的。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=20000001;
int h[21];
int dp[maxn];
int n,v,sum;
int main()
{
while(scanf("%d%d",&n,&v)==2)
{
sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&h[i]);
sum+=h[i];
}
for(int i=0;i<=sum;i++)
dp[i]=0;
for(int i=1;i<=n;i++)
for(int j=sum;j>=h[i];j--)
dp[j]=max(dp[j],dp[j-h[i]]+h[i]);
int ans=(1<<30);
for(int i=1;i<=sum;i++)
if(dp[i]>=v){printf("%d\n",dp[i]-v);break;}
}
}