标签:using highlight namespace ace int ems ret style ios
题目:给出一个数组,将其分为两份,使得这两份差值最小。
解答: 比如a={4,3,2,1},其实只要让其逼近sum(a)/2即可,所以可以等效于一个背包容量为5,从a中取出若干件物品,将其装满,但是这样会出现问题,就是4+1,3+1都符合条件,(如果我们假设他们价值为1的话,受网上误导很大),事实上,可以假设其价值就是他们的重量,那么该问题就会在尽可能装满背包的前提下同时尽可能取更大的数,而同时所得到最终价值也正是我们取出来的数组的和,便于计算,代码如下:
#include<iostream>
#include<memory.h>
using namespace std;
int main()
{
int w[1000];
int v[1000];
int V;
int temp,N;
cin>>N;
int sum=0;
for(int i=1;i<=N;i++)
{
cin>>temp;
sum+=temp;
w[i]=temp;
v[i]=temp;
}
V=sum/2;
int f[N+1][V+1];
memset(f,0,sizeof(f));
for(int i=1;i<=N;i++)
{
for(int j=1;j<=V;j++)
{
if(w[i]>j)
f[i][j]=f[i-1][j];
else
{
int a=f[i-1][j-w[i]]+v[i];
int b=f[i-1][j];
if(a>b)
f[i][j]=a;
else
f[i][j]=b;
}
}
}
cout<<sum-2*f[N][V]<<endl;
return 0;
}
标签:using highlight namespace ace int ems ret style ios
原文地址:http://www.cnblogs.com/xlqtlhx/p/7574263.html