裸的01背包
概述:n件物品,分2堆,使得总和的差最小;
算法:01背包,total/2的容量,往两边找,最先找到的差值就是了;
wa因:输出差值,忘记加绝对值了
#include <iostream>
#include <cstring>
#define MAXN 2000000+10
using namespace std;
int data[25];
bool f[MAXN];
int n,total,temp;
void init()
{
cin>>n;
total=0;
for(int i=1;i<=n;i++)
{
cin>>data[i];
total+=data[i];
}
}
void dpit()
{
memset(f,0,sizeof(f[0]));
f[0]=true;
for(int i=1;i<=n;i++)
{
for(int v=total;v>=0;v--)
{
if (v-data[i]>=0)
f[v]=f[v]||f[v-data[i]];
}
}
}
void findit()
{
temp=total/2;
for(int i=0;i<=temp;i++)
{
if (f[temp+i])
{
cout<<abs((temp+i)-(total-temp-i))<<endl;
break;
}
if (f[temp-i])
{
cout<<abs((total-temp+i)-(temp-i))<<endl;
break;
}
}
}
int main()
{
init();
dpit();
findit();
return 0;
}