标签: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