思路: 0/1背包
分析:
1 题目抽象出来的话就是0/1背包
2 我们用dp[i][j]表示前i头牛放在高度为j的最小高度,那么我们只要求出
dp[n][B~s]中的最小值,然后减去B即可
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int INF = 0x3f3f3f3f; const int N = 20; int n , B , s; int v[N] , dp[N*1000001]; int solve(){ for(int i = 0 ; i <= s ; i++) dp[i] = INF; dp[0] = 0; for(int i = 1 ; i <= n ; i++) for(int j = s ; j >= v[i] ; j--) dp[j] = min(dp[j] , dp[j-v[i]]+v[i]); int ans = INF; for(int i = B ; i <= s ; i++) if(dp[i] >= B) ans = min(ans , dp[i]); return ans-B; } int main(){ while(scanf("%d%d" , &n , &B) != EOF){ s = 0; for(int i = 1 ; i <= n ; i++){ scanf("%d" , &v[i]); s += v[i]; } printf("%d\n" , solve()); } return 0; }