标签:
题目大意:FJ有n头奶牛,和一个高为h的架子,给出每头奶牛高度,求使奶牛叠加起来超过架子的最低高度是多少。
题目思路:求出奶牛叠加能达到的所有高度,并用dp[]保存,最后进行遍历,找出与h差最小的dp[]即所求答案。
#include<cstdio> #include<stdio.h> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<queue> #define INF 0x3f3f3f3f #define MAX 2000005 using namespace std; int dp[MAX],a[MAX],sum,ans; void Init() { sum=0; ans=INF; memset(dp,0,sizeof(dp)); } int main() { int i,j,maxn,n,h; while(scanf("%d%d",&n,&h)!=EOF) { Init(); for(i=1;i<=n;i++) {scanf("%d",&a[i]);sum+=a[i];} for(i=1;i<=n;i++) { for(j=sum;j>=a[i];j--) { dp[j]=max(dp[j],dp[j-a[i]]+a[i]); } } for(i=1;i<=sum;i++) { if(dp[i] >= h)//如果满足条件,则继续进行比较,保留较小的值 { ans=min(ans,dp[i]-h); } } printf("%d\n",ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/alan-W/p/5737998.html