POJ 3682 (dp)

来源:互联网 发布:手机版 淘宝 人工客服 编辑:程序博客网 时间:2024/06/05 03:49

题意:有n头牛和B高度的书架,牛叠罗汉,需要求出最少的牛的高度和超过或者等于B。


很明显不能用二位的01dp


有一个很好的思路,因为并不知到v[i],我们可以使w[i] == v[i],并且可以把容量大于B,也就是sum>B.这是必然的,不然也是没有意义。

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn = 21000;int dp[maxn];int n,m;int w[25],sum;int main(){    //freopen("in.txt","r",stdin);    scanf("%d%d",&n,&m);    sum = 0;    memset(dp,0,sizeof(dp));    for(int i = 0;i < n; i++){        scanf("%d",&w[i]);        sum += w[i];    }    for(int i = 0;i < n; i++){        for(int j = sum;j >= w[i]; j--){            dp[j] = max(dp[j],dp[j-w[i]]+w[i]);        }    }    int i;    for(i = 0;i < sum; i++){        if(dp[i] >= m){            break;        }    }    printf("%d\n",dp[i]-m);    return 0;}


0 0
原创粉丝点击