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;
}