poj 3628 Bookshelf 2 (0/1背包)

来源:互联网 发布:校园网绑定mac地址 编辑:程序博客网 时间:2024/04/28 13:15

点击打开链接poj 3628

思路: 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;}


原创粉丝点击