题解 T46030 【1254: [DP地狱训练]石子归并】

2018-09-16 00:00:00 题解

1253:多重背包问题,把每一种重量的砝码二进制分割,然后设计dp方程表示某种重量是否能秤出。

1254: 越靠近平均值的数,能取得到越好.d=sum-2*t;t越靠近sum/2越好;

1257又是求怎么把数据尽可能的平均分配,这里多了一个限定条件,数量上有平均分配。那就多加一个维度。f[i][k] :产量不超过I, k头奶牛最大产量。

1255去求 离mid越来越近的值。01 背包,取不取得到。f[I] 时间不超过i,去补圣衣,所花最长的时间。

代码

#include<bits/stdc++.h>
using namespace std;
int total=0;
int a[55];
int f[250005];
int read(){
    int x=0;char s=getchar();int b=1;
    while(s>'9'||s<'0'){
        if(s=='-')  b=-1;
        s=getchar();
    }
    while(s<='9'&&s>='0'){
        x=x*10+s-'0';
        s=getchar();
    }
    return b*x;
}
int main()
{
    freopen("1254.in","r",stdin);
    freopen("1254.out","w",stdout);
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        a[i]=read();
        total+=a[i];
    }
    for(int i=1;i<=n;++i){
        for(int j=total/2;j>=a[i];--j){
            f[j]=max(f[j],f[j-a[i]]+a[i]);
        }
    }
    printf("%d",total-f[total/2]-f[total/2]);
    return true;
}