51nod 1007 正整数分组 (类01背包问题)

来源:互联网 发布:网络乞丐伴奏 编辑:程序博客网 时间:2024/05/29 13:27
将一堆正整数分为2组,要求2组的和相差最小。

例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的。


这道题就是要求在n个数字里面选出一些数,计算出这些数字的和,然后在计算出剩下数字的和然后求出这两个和的差的最小值,我们可以看出,关键就是怎么样选这些数字。

选数字,这就和01背包有点像了。我们可以先计算出这些数字的总和,然后将背包的容量看成是这个和的一半,然后从这些数字里面选出一些来看这个背包最多能装多少就可以了。


#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;int const maxn = 10005;int dp[maxn];int a[105];int main(){    int n,v,sum ;    while(scanf("%d",&n)!=EOF)    {        sum = 0 ;        for(int i = 0 ; i < n ; i++)        {            scanf("%d",&a[i]);            sum+=a[i];        }        v=sum/2;        memset(dp,0,sizeof(dp));        for(int i = 0 ; i < n ; i++)        {            for(int j = v ; j >= a[i] ; j--)            {                dp[j]=max(dp[j],dp[j-a[i]]+a[i]);            }        }        printf("%d\n",sum-2*dp[v]);    }    return 0;}


0 0
原创粉丝点击