您的位置:首页 > 其它

POJ 2576 Tug of War二维背包恰好装满.

2013-03-27 21:22 92 查看
像这种恰好装满的情况可以用bool数组,恰好装满为true,否则为false。

还有就是逆向推倒,0-1背包,f[i][j]表示有i个人,组成了j的体重,这样的话在考虑某人的情形时,f[i][j]为真的前提就是f[i-1][j-wi]为真,其中wi为这个人的体重

View Code

#include <cstdio>
#include <cstring>
#include <cmath>
bool f[110][2500];
int main()
{
int n,w[110],sum = 0;
scanf("%d\n",&n);
memset(f,false,sizeof(f));
f[0][0] = true;
for(int i=0; i<n; i++)
{
scanf("%d",&w[i]);
sum += w[i];
}
int v = n/2;
for(int i=0; i< n; i++)
{
for(int j = v; j >= 0; j--)
{
for(int k=sum; k >= 0; k--)
{
if( j >=1 && k>= w[i] &&f[j-1][k-w[i]])
f[j][k] = true;
}
}
}
int mi1=0,mi2=sum;
double dif = sum;
for(int i=sum-1; i>=0; i--)
{
if(f[v][i] && dif>fabs(sum-2*i))
{
mi1 = i;
mi2 = sum-i;
dif = fabs(sum-2*i);
}
}
if(mi1 > mi2)
printf("%d %d\n",mi2,mi1);
else  printf("%d %d\n",mi1,mi2);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: